[读书笔记] C++Primer (第5版) 第7章 类

struct Sale_data{
std::string isbn() const {return bookNo; }
std::string bookNo;
}
1.函数调用
类内定义的函数是隐式的inline函数。
Sale_data data; data.isbn(); 调用成员函数时,实际是在为data调用。
成员函数通过this(额外的隐式参数)来访问data。编译器负责把data的地址传递给isbn的this。
this(常量指针)不允许改变this中保存的地址。
常量成员函数:列表后面有const,表示this是一个指向常量的指针。
2.构造函数:
直到构造函数完成初始化,对象才能真正取得其常量属性。
只有类没有声明任何构造函数时,编译器才会自动生成默认构造函数。
Sale_data() = default; // 使用默认构造函数 C++11新标准
Sale data(string &s): bookNo(s){}; // 构造函数初始值列表(注意这是初始化)
Sale_data(string &s){
m_str = s; // 这是赋值,与上面区别开
}
有一个形成的构造函数,可以从该构造函数的参数类型,隐式转换成类类型(只可以一步转换)。
explicit:可以阻止隐式转换(放在构造函数名字前面)。
3.友元函数:
类可以允许其他类或函数访问它的非公有成员。
Class A{
Friend bool read(int nA, int nB); // 可以访问非公有变量m_nBookID了
private:
int m_nBookID;
}
友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。
友元函数的声明和定义要在类外,和普通函数一样的声明定义形式。
Class A{
friend B; // B是A的友元类,可以访问A的私有成员,但A不可以访问B。
friend void C::Func(); //之前必须被声明,必须指出该成员函数属于哪个类
4.返回*this的成员函数
const成员函数以引用的形式返回*this,那么返回类型将是常量引用。
当一个成员调用另一个成员时,this指针在其中隐式地传递。
5.类的声明
class Screen; // Screen类的声明
在创建对象前,该类必须被定义过。让编译器知道该类占多少存储空间。
6.名字查找
类的定义分为两步:
①编译成员的声明
②直到类全部可见后才编译函数体
名字查找:寻找与所用名最匹配的声明
①在名字所在块中寻找其声明语句(只考虑在名字使用之前出现的声明)。
②如果没找到,继续查找外层作用域。
③如果最终没有找到匹配的声明,则程序报错。
如果某个成员的声明使用了类中尚未出现的名字,则编译器将会在定义该类的作用域中继续查找。
成员函数中使用的名字的查找:
①在成员函数内查找(向上查找)
②如果没找到,在内容继续查找(可以考虑类中的所有成员)
③如果没找到,在成员函数定义前的作用域内继续查找
7.作用域
内层作用域可以重新定义外层作用域的名字。
如果使用了外层作用域的某个名字,而该名字代表的类型,不可以重新定义。
8.成员初始化顺序与它们在类定义中出现的顺序一致
9.委托构造函数:
使用他所属类的其他构造函数,来执行他自己的初始化过程。
class A{
A(int a, int b):m_na(a), m_nb(b){}
A (int a): A(a, 0){} //委托构造函数
}
10.静态成员
Static 关键字。
静态成员不与任何对象绑定,静态函数中也不可以使用:This指针或非静态的成员。
使用作用域直接访问静态成员。
Static关键字只能出现在类内部的声明语句中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值