类的定义
使用class或struct定义,区别在于前者默认private,后者则是public。
需要注意的是,类定义后面有分号!!!
原因是C++支持类定义后面跟上变量列表--即用于定义类变量!
但是,极其不赞成这样做(类定义后面跟着变量列表)。
如果试图定义一个类的对象,那必须先定义类!--如果是声明,那类对象也只能声明。声明是不占存储空间的!
由于必须先定义类,所以类内部无法使用其本身类型定义的对象!
但是,由于类头本身就是声明,所以可以使用类的指针或者引用!
20160627补充:类的static成员可以是类类型!!!
类的成员方法
关于隐形形参this,见之前的文章。
需要注意的是,
① 类的const成员只能调用const成员。
--所以,我们可以重载类中的const成员函数。
类的成员方法,必须在内部声明,但定义则内外皆可。区别在于,内部定义的,默认inline。
类的构造函数
需要注意的是初始化列表,无论有没有显式的初始化列表,成员数据都会初始化!显式初始化或隐式初始化!初始化不是赋值!
class X{ private: string name; int age; public: X():name("name"),age(18){} //构造函数之初始化列表 //... }; //分号!
上面示例的构造函数及其初始化列表。
需要注意,
① 初始化的成员变量,应该连起来更容易理解。如string name和name("name"),连起来就是string name("name")。
这样做更容易理解后面这个例子:name(8, 'a') !
② 如果初始化列表中没有涵盖全部成员变量,那会以隐式方式进行初始化。
③ 初始化列表中的顺序与初始化顺序无关,初始化顺序就是变量定义的顺序!
④ 构造函数也可以重载,也可以有默认实参!
需要注意的是,如果给全部的形参提供默认实参,那相当于有多个无参构造!构造不会报错,但创建无参对象会异常。
⑤ 如果没有提供构造函数,默认会生成一个无参构造函数。
但是,只要有一个显式的构造函数,就不会生成!
另外,初始化列表和构造体赋值是两回事,初始化在构造体之前!
由于初始化总会进行,所以:
① 使用构造体进行赋值效率较低,因为还是先初始化了,再覆盖。
② const对象和引用对象必须初始化!如果赋值则会错误!
类对象的声明和定义
以类X为例:
X x;//声明
x=X(); //初始化
class X y; //C的格式,C++可以去掉class。
其他:前向声明只能用于声明指针或引用的情况。