C++ primer 第7章 类


类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术。类的借口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数及类所需的各种私有函数。

定义在类内部的函数是隐式的inline函数。

// 头文件
class A
{
    public:
    void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){} 

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用

如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y){}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y){} // inline 与函数定义体放在一起

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”

以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。

this
this是一个常量指针,不允许改变this中保存的地址~
this不能绑定到一个常量对象上。(仍要遵循初始化规则)
关于函数参数列表后面的const
const作用是修改隐式this指针的类型,this此时变为一个指向常量的指针。
常量成员函数~~~是不能改变调用它的对象的内容—可以读取但不能写入新值。

常量对象和常量对象的引用或指针都只能调用常量成员函数

为什么定义成员函数在成员变量之前还能使用成员变量?
编译器分2步处理类:1.编译成员的声明 2.然后才轮到成员函数体
所以无须在意成员出现次序。

一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件中。

构造函数不能被声明成const
当创建一个const对象时,知道构造函数完成初始化,对象才能取得其“常量”属性。

一旦定义了其他构造函数,那么默认构造函数就不再自动生成
只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数

类名()=default; 在类的内部默认是内联的。然后 这是要求编译器生成默认构造函数,

使用class和struct定义类唯一区别就是默认的访问权限

typedef std::string::size_type pos;
等价于
using pos = std::string::size_type;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值