C++ 类

类的定义

使用class或struct定义,区别在于前者默认private,后者则是public。

需要注意的是,类定义后面有分号!!!

原因是C++支持类定义后面跟上变量列表--即用于定义类变量!

但是,极其不赞成这样做(类定义后面跟着变量列表)。

如果试图定义一个类的对象,那必须先定义类!--如果是声明,那类对象也只能声明。声明是不占存储空间的!

由于必须先定义类,所以类内部无法使用其本身类型定义的对象!

但是,由于类头本身就是声明,所以可以使用类的指针或者引用

20160627补充:类的static成员可以是类类型!!!

类的成员方法

关于隐形形参this,见之前的文章。

需要注意的是,

在普通的非 const 成员函数中,this 的类型是一个指向类类型的 const 指针。--不能修改指针!
在 const 成员函数中,this 的类型是一个指向 const 类类型对象的 const 指针。--既不能改变 this 所指向的对象, 也不能改变 this 所保存的地址。

① 类的const成员只能调用const成员。
② const成员函数可以重载非const成员函数。
③ 根据指针形参是否指向const对象也可以重载函数。
④ 非 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。

其他:前向声明只能用于声明指针或引用的情况

原文地址:https://www.cnblogs.com/larryzeal/p/5612525.html