C++类的知识点

1.内联函数 inline

在类定义内部定义函数时,编译器暗中将其作为内联函数对待。

在内联函数中,编译器设法以函数体代码代替函数调用。这样可以避免调用函数的大量系统开销,因此加速代码的执行。编译器将确保不引起任何变量名或作用域的有关的问题。

编译器不一定总能插入内联函数的代码(比如递归函数或返回地址的函数),但通常应该没有问题。内联函数最适合于那些非常短的简单函数,因为这样的函数执行的更快,

而且插入其函数体的代码不会显著郑家可执行模块的大小。

在函数定义位于类外部定义的外部的情形中,编译器将函数当做普通函数,函数调用将以通常的方式进行。在函数头前面加上 inline 关键字,告诉编译器将其视为内联函数。

2.构造函数

构造函数没有任何返回类型,即使写成 void 也绝不允许。

默认构造函数:一旦自己提供了构造函数,编译器就会认为我们处理所有问题,因而不会提供默认构造函数。解决方法:定义无参数构造函数。

如果已经定义了指定默认形参的构造函数,则不需要默认构造函数,否则编译器不知道是调用指定默认形参的构造函数,还是没有任何形参的构造函数。

解决方法:不用无参数构造函数。

有意思的是:指定部分形参的构造函数,需要构建无参构造函数。

3.友元函数 friend

不是类成员的函数能够访问类的所有成员,这样的函数称为友元函数。在类定义内定义的友元函数也是内联函数。

友元函数不是类的成员,因此访问特性不适用于它们,这些函数只是拥有特殊权限的全局函数。

4.默认的复制构造函数

对于拥有指针或数组成员的类,复制构造函数不能正常工作,必须常见自己的构造函数。

为了避免对复制构造函数的无穷调用,必须将形参指定为 const 引用。

如果动态为本地C++类的成员分配空间,则必须实现复制构造函数。

5.类的 const 对象

为了使类的成员函数中的this指针成为 const ,必须在类定义内将该函数声明为 const 。要指定 const 成员函数,只需要在函数头后面加上 const 关键字。

注意我们只能对类成员函数这么做,对普通全局函数不能这么做。函数中的 this 指针成为 const ,这意味着我们不能在该函数的定义内在赋值语句的左边写上类的数据成员,

那将被编译器标记为错误。const 成员函数不能调用同类的非 const 成员函数,因为那样也可能修改当前对象。当我们将某个对象声明为 const 后,

该对象可以调用的成员函数也都必须是 const,否则程序将不能编译。

6.析构函数

 默认的析构函数不能删除 new 运算符在自由存储器中分配的对象或对象成员。如果类成员占用的空间是在构造函数中动态分配的,我们就必须自定义析构函数。

然后显式使用 delete 运算符来释放构造函数使用的 new 运算符分配的内内存,就像销毁普通变量一样。

7.运算符重载

 使用引用形参避免不必要的复制开销。不需要修改调用它的对象时,将其声明为 const 。如果我们不这样做,将根本不能使用该运算符比较 const 对象。

重载赋值运算符:

如果我们不亲自给自己的类提供重载的赋值运算符函数,编译器将提供一个默认的函数。

对于动态给成员分配内存空间的类,需要自定义赋值运算符。考虑到赋值运算符的右结合性,返回对象的引用。

8.派生类

为了控制从基类继承的成员的状态,我们必须总是写出基类的访问符。如果省略基类的访问说明,则编译器将默认该说明符是 private.

9.派生类构造函数

当我们为派生类编写构造函数时,有责任初始化包括初始成员在内的派生类对象的所有成员。

派生类的复制构造函数的初始化列表需要调用基类的构造函数。

10.虚函数 virtual

要使某个函数表现出虚函数的行为,该函数在任何派生类中都必须有与基类函数相同的名称,形参列表,返回类型。如果积累函数是 const,那么派生类中的函数也必须是 const.

如果我们企图使用不同的形参或返回类型,或者讲一个声明为 const,而另一个则不然,则虚函数机制不能工作。函数的行为将在编译时通过静态链接确定。

多态性就是虚函数功能。

纯虚函数

通过在函数头添加 “=0”,将函数定义为没有任何类容的纯虚函数。

抽象类

包含纯虚函数的类称为抽象类。抽象类不能实例化。

在赋予指针另一个对象之前,我们必须从自由存储器中删除前一对象,如果不这样做,我们以后将不能清理自由存储器。因为已经失去了原来对象的地址。

当重新给指针赋值以及使用自由存储区时,这是个易犯的错误。

 虚析构函数

当对象在自由存储器中创建时。析构函数的连接是在编译时静态解析的,对自动小对象而言,这样做没有任何问题,编译器知道他们是什么,

也能调用正确的析构函数。但对于动态创建并通过指针访问的对象来说,情况就不同了。当执行 delete 操作时,

编译器知道的唯一信息是该指针的类型是指向基类的指针。编译器并不知道该指针司机指向的对象类型,因为这是在程序执行时确定的。

因此编译器只能确保使 delete 操作带哦用基类的析构函数。

 

 

原文链接: https://www.cnblogs.com/army3force/archive/2012/07/22/class.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++类的知识点

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/56270

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午7:13
下一篇 2023年2月9日 上午7:14

相关推荐