class Fraction {
public:
Fraction(int num, int den = 1) :
m_numerator(num), m_denominator(den) {
}
operator double()const {
return ((double)m_numerator / m_denominator);
}
private:
int m_numerator; //分子
int m_denominator;//分母
};
Fraction f(3,5);
double d = 4 + f;
说明:
std::cout << typeid(f).name()<<std::endl;//class Fraction
std::cout << d <<std::endl;//4.6
注意:
class Fraction
{
public:
Fraction(int num,int den = 1):
m_numerator(num),m_denominator(den){}
Fraction operator+(const Fraction& f){
return Fraction(...);
}
private:
int m_numerator;
int m_denominator;
};
Fraction f(3,5);
double d = 4 + f;
说明:
class Fraction
{
public:
Fraction(int num,int den = 1):
m_numerator(num),m_denominator(den){}
operator double()const {
return ((double)m_numerator / m_denominator);
}
Fraction operator+(const Fraction& f){
return Fraction(...);
}
private:
int m_numerator;
int m_denominator;
};
Fraction f(3,5);
double d = 4 + f;
class Fraction
{
public:
explicit Fraction(int num,int den = 1):
m_numerator(num),m_denominator(den){}
operator double()const {
return ((double)m_numerator / m_denominator);
}
Fraction operator+(const Fraction& f){
return Fraction(...);
}
private:
int m_numerator;
int m_denominator;
};
Fraction f(3,5);
double d = 4 + f;
说明:
注意:"->"这个符号很特别
说明:
说明:
说明: 黄色这一块是当前模板的一个成员,同时它自己也是个模板。所以它就叫做成员模板。
在STL标准库中会大量出现成员模板,先来一个小示例:
解释:
构造函数更有弹性
。template<calss T1,class T2>
struct pair{
...
template<class U1,class U2>
pair(const pair<U1,U2>&p):first(p.first),second(p.second){}
};
用的时候指定类型
。// 泛化
#include <iostream>
using namespace std;
// 泛化
template<class Key>
struct hash1{};
// 特化
template<>
struct hash1<char>{
size_t operator()(char x)const {
return x;
}
};
template<>
struct hash1<long>{
size_t operator()(long x)const {
return x;
}
};
int main(void){
// 调用
hash1<long>()(1000);// 构造一个hash的临时对象,传递参数1000,找到上面的特化long
return 0;
}
deque< T >
>第二个参数,不是模板模板参数。#include <iostream>
#include <bitset>
using namespace std;
void print(){}
// 分为一个和一包
template<typename T,typename... Types>
void print(const T& firstArg,const Types&...args) {
cout<<firstArg<<endl;
print(args...);// 调用,将这一包拆开
// 注意: 到最后变成0个的时候,将会调用上面的print()
cout<<sizeof...(args)<<endl;// 获得这一包中有几个元素
}
int main(void){
print(7.5,"hello",bitset<16>(377),42);
return 0;
}
list<string>c;
//...
list<string>::iterator ite;
ite = find(c.begin(),c.end(),target);
auto ite = find(c.begin(),c.end(),target);// 定义使用时就赋值
auto ite;// 编译器不能也无法知道这个ite是什么,无法进行推导
ite = find(c.begin(),c.end(),target);
for(decl: coll){
statement
}
vector<double>vec;
//...
// pass by value 传值
for(auto elem:vec){
cout<<elem<<endl;
}
// pass by reference 传引用——改变原来的东西
for(auto& elem:vec){
elem *=3;
}
引用一定要设初值,且之后无法再代表其它值。
int x = 0;
int* p = &x;// p指向x
int& r = x;// r代表x
int x2 = 5;
r = x2;// x r都为5,相当于将值5赋给x
int& r2 = r;
sizeof(r) == sizeof(x);
&x == &r;
double imag(const double& im){...}
double imag(const double im){...}
当成员函数的const版本和非const版本都存在,则常量对象只能调用const版本,非const对象只能调用非const版本。
//调用
MyComplex *pc = new MyComplex(1,2);
void* temp = operator new(sizeof(MyComplex));// 分配内存-相当于调用malloc(n)
pc = static_cast<MyComplex*>(temp);//转型
pc->MyComplex::MyComplex(1,2);//调用构造函数
delete pc;
Complex::~Complex(pc);
operator delete(pc);//(即 调用free)
Foo* pf = new(300,'c')Foo;