class A
{
public:
A(int i) : mi(i) { printf("A constructor."); }
~A() { printf("A destructor.\n"); }
A (const A& src)
{
mi = src.mi;
printf("A copy constructor.\n");
}
private:
int mi;
};
A mm = 1;
当执行这句话时,实际上是先执行A(1),产生一个临时对象,再调用拷贝构造函数利用这个临时对象产生一个新的对象。
关于这种说法,我试了一下,可能不对,并没有发现产生一个临时对象,产生的临时对象肯定也是A这个类型,那么它会调用构造函数和析构函数,最终A mm = 1;这句话,最终肯定会调用1次构造函数(临时对象),1次拷贝构造函数(构造新对象),2次析构函数(临时对象与新的对象)。
我试验的结果是:它只调用了一次构造函数,一次析构函数,这样的话,上面那种说法就不对了。我估计原因是编译器不同。
A mm = 1;
-----------------------------------------------------------------------------------------
2、默认的拷贝构造函数是按位拷贝,不会对里面的指针进行内存拷贝,所以如果类里面有指针成员,就应当写这个类的拷贝构造函数和赋值函数,如果想省事,也可以把拷贝构造函数和赋值函数声明为私有的或保护的。 如
class A
{
public:
A(int i) ;
~A();
private:
A (const A& src);
A& operator=(const A&src);
private:
char *data;
};
-------------------------------------------------------------------------------------------
3、转换类型
const_cast 常量性去掉
dynamic_cast 向子类转型
reinterpret_cast 低级转型,一般不可移植
static_cast 加上常量性,强迫隐式转换,基本都可用这个
dosome(static_cast<Mater>(15));若Mater构造函数为explicit也可以这样来调用其构造临时对象dynamic_cast尽量少用
if(MaterD *pm=dynamic_cast<MaterD *>(maters))...
---------------------------------------------------------------------------------------------
4、handle即操作句柄并没有其他意思
5、在class声明中定义的函数都是inline的
6、对virtual函数调用的inline函数将落空
7、virtual意味着"等待,直到运行时才决定"
8、用函数指针访问的inline函数通常不在被调用点inline
9、如果有个异常在对象构造期间抛出,已构造的那部分将被销毁
10、构造函数不要声明为inline
11、记住一点当单当编译器看到定义式的时候一定知道定义的东西的大小
12、当声明一个函数用道class时并不需要其定义(返回值也一样)
暂时就这么多,以后遇到了再总结。