C++ 类

Posted LarryZeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 类相关的知识,希望对你有一定的参考价值。

类的定义

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

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

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

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

 

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

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

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

 

类的成员方法

关于隐形形参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){} //构造函数之初始化列表
    //...
}; //分号!

上面示例的构造函数及其初始化列表。

需要注意,

① 初始化的成员变量,在初始化列表中看做相应类型更容易理解。如name("name"),看做string("name")。

    这样做更容易理解后面这个例子:name(8, ‘a‘) --这是直接调用string的构造函数来进行name的初始化!

② 如果初始化列表中没有涵盖全部成员变量,那会以隐式方式进行初始化。

③ 初始化列表中的顺序与初始化顺序无关,初始化顺序就是变量定义的顺序!

④ 构造函数也可以重载,也可以有默认实参!

    需要注意的是,如果给全部的形参提供默认实参,那相当于有多个无参构造!构造不会报错,但创建无参对象会异常。

⑤ 如果没有提供构造函数,默认会生成一个无参构造函数。

    但是,只要有一个显式的构造函数,就不会生成!

 

另外,初始化列表和构造体赋值是两回事,初始化在构造体之前!

由于初始化总会进行,所以:

① 使用构造体进行赋值效率较低,因为还是先初始化了,再覆盖。

② const对象和引用对象必须初始化!如果赋值则会错误!

 

类对象的声明和定义

以类X为例:

X x;//声明

x=X(); //初始化

class X y; //C的格式,C++可以去掉class。

 

以上是关于C++ 类的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段 C++ 的说明

C++ 代码片段执行

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

C++ 代码片段(积累)

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

什么是在 C++ 中获取总内核数量的跨平台代码片段? [复制]