C++ Primer5 chapter7 类 笔记

1.常量成员函数

void A() const;这里参数列表后的const其实修饰的是this指针,用来表明this指向的是一个常量对象,这样自然就不允许修改对象的属性。

常量对象,以及常量对象的指针或引用只能调用常量成员函数。

2.构造函数

1)构造函数不能声明为const函数

2)如果没有定义构造函数,编译器会生成一个不带参数的默认构造函数,又称合成的默认构造函数。如果自己定义了构造函数,编译器就不会生成默认构造函数。如果类A内定义了其他类B类型的成员,而B没有默认构造函数,那么编译器不会为A生成默认构造函数。

可以使用=default来要求编译器生成默认构造函数,如果=default出现在构造函数声明的地方,则此构造函数默认是内联的,如果=default出现在构造函数实现的地方,则此默认构造函数是非内联的。

3)对于const、引用以及未提供默认构造函数的类类型的数据成员,只能在构造函数列表初始化中进行初始化,不能通过赋值进行初始化。构造函数中的赋值初始化,其实隐含着先对数据成员进行默认初始化,然后再用新的值进行赋值。

4)委托构造感觉就是一个函数调用,为啥作为个新特性呢

5)自动调用默认构造函数的场景

(1)默认初始化

a. 在块作用域内不使用任何初始值定义一个非静态变量或者数组.这一点和内置类型的局部变量不同,函数内的内置类型局部变量不会被初始化。

b.调用一个类的合成默认构造函数且该类含有类类型的数据成员,这个数据成员的默认构造函数将被调用

c.类类型的数据成员没有在列表初始化中被初始化。如果没有在列表初始化中被初始化,会在构造函数内赋值初始化,默认初始化,以及使用类内值进行赋值初始化。赋值前都会先默认初始化。

(2)值初始化

a.给数组提供的初始值的个数小于数组元素个数。

b. 不使用初始值定义一个局部静态变量

c.通过T()的形式显式进行值初始化,T为类型名,比如vector<int> v(10)

6)explicit

explicit用于只有一个参数的构造函数,用于阻止构造函数定义的隐式转换。多个参数的构造函数不能使用explicit,实际上也没必要。只能在声明时使用explicit,定义时不能使用。

对于explicit修饰的构造函数,可以直接显式调用,或者使用static_casr<A>(para)的方式调用。

 

3.拷贝、赋值、析构函数

类的成员使用vector或string,则默认的合成函数可以正常工作。如果是其他动态分配内存,默认合成函数无法工作,比如类中含有指针成员。

4.友元

可以定义一个类A或者函数F是另一个类B的友元,只能定义在类B的内部,具体位置不限。友元声明只是用来控制访问权限的,不是函数或者类的声明,如果B内部想使用A或者F,最好在B的外部进行声明。有些编译器允许不声明A或者F,就可以在B中使用它们。

友元关系无传递性。

 

5.成员函数

1)在类中可以使用typedef或者using定义别名,别名必须先定义后使用,并且有访问权限控制。

2)对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline )函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明,在函数的声明或函数的定义两者之一作inline声明即可。值得注意的是,如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行置换(将函数代码的拷贝嵌入到函数调用点)。

3)对于被mutable修饰的成员,即使在const方法中,也可以修改这些成员的值。

4)类内初始值只能使用=或者{}

5)const方法如果以引用形式返回*this,则此引用是const

6)在一个类A的内部,不能出现类型是A的成员,因为编译器无法确定此成员的大小,但可以出现A*或者A&,还可以是静态数据成员。

7)对于类A的成员函数的返回值,如果返回值的类型是A中定义的,那么需要在类型前加类名,否则,编译器不认识这个类型

A::type A::func(){    } 

8)如果在类外部定义了一个类型名,比如typedef int  A;在类的内部不能重新定义一个名字为A的类型,即使类内部A的名字和外部的类型相同,也不可以。不过有些编译器能通过编译。

6.聚合类

聚合类使用{}初始化

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值