1.类的静态成员,在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。
如果静态成员是整形或枚举型const,则可以在类声明中初始化。
2.值传递的时候会调用复制构造函数,如果代码里面没有复制构造函数,则会生成一个系统默认的。
但是函数结束之后,就会调用析构函数。
如果是使用浅复制,可能会把原来的对象某些东西更改掉了。
构造函数的原型一般这样:
className(const className& );
3.C++会提供一些特殊的函数,如果程序本身没有定义的话。
默认构造函数
默认析构函数
复制构造函数
赋值运算符
地址运算符
C++11提供了另外两个特殊的成员函数:移动构造函数和移动赋值运算符
这些都是在程序员自己不提供的情况下,编译器自动生成默认的。
4.带参数的构造函数,如果所有参数都有默认值,则可以作为默认构造函数
但是,只能有一个默认构造函数,否则有二义性。
class StringBad
{
public:
StringBad(const char*s = "" );
StringBad();
普通函数可以这样的,不会产生二义性
int sb(){}
int sb(int a = 0){}
5.如果类中包含了在新对象创建时发生变化的静态数据成员,应该提供一个显示复制构造函数来处理计数问题。
6.如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。
复制的另一种形式(成员复制或浅复制)只是复制指针值。浅复制仅浅浅复制指针信息,而不会深入挖掘以复制指针引用的结构。
7.赋值运算符,C++允许类对象赋值,通过自动为类重载赋值运算符实现的。原型如下:
className& className::operator=(const className&);
初始化对象的时候,并不一定使用赋值运算符,可能使用复制构造函数。
也可能使用复制构造函数,创建了一个临时对象,然后复制到新对象。
8.C++11用nullptr来表示空指针。
9.构造函数如果用到new,析构函数要用到delete,如果是new[],则要用delete[]。
10.析构函数是可以显式调用的,使用定位new的对象可以显式调用析构函数。这样析构了自身,也不会删除了内存块。
11.构造函数的成员初始化列表,对于const的成员也能初始化。
class CTest
{
const int a;
CTest();
}
CTest::CTest():a(123)
{
}
对于被声明为引用的常量,也可以使用这种语法。
只有构造函数才能使用这种语法。