每一次看书都只看了几页就落下了,觉得这样并不行,所以还得记录一下看过的内容,先从C++ primer的学习开始吧,现在主要还是记录关于C++类的相关知识。
基本概念
- 数据抽象
- 封装
- 接口
- 实现
- 抽象数据类型
接口
接口简单理解为用户所能执行的操作
实现
实现则包括类的数据成员以及接口实现的函数
数据抽象
数据抽象依赖于分离接口和实现
封装
封装实现了类的接口和实现的分离
抽象数据类型
类的设计者考虑类的实现过程,类的使用者只需要知道该类型可以做什么
函数的声明和定义
成员函数必须声明在类的内部,但即可以定义在类的内部,也可以定义在类的外部。定义在类内部的成员函数为隐式inline函数。
类接口组成部分的非成员函数,声明和定义都在类的外部。
类接口组成部分的非成员函数,一般其声明也和类在同一个头文件中。
this指针
类拥有一个隐式的成员this指针,当某个对象调用成员函数的时候,将会使用该对象额地址初始化this指针。
this是一个常量指针,不允许将this指针指向其他的对象。
常量成员函数
std::string isbn() const {return bookno;}
const 修饰this指针,表明this指针指向的对象是常量,即常量成员函数不能改变调用它的对象的内容。
常量对象只能调用常量成员函数,因为,非常量成员函数可能会修改调用它的对象的值。
Sales_data::
在类外部定义的成员函数,需要使用作用于运算符来指明函数是声明在类中的,会在类的作用域中来进行名字解释。
构造函数
构造函数不能声明为const,如果构造函数可以声明为const,那么对于调用构造函数的对象而言,将不能完成该对象的初始化操作,因为,不能够修改该对象。
默认构造函数
默认构造函数无需实参
在没有声明任何其他构造函数的情况下,编译器合成默认构造函数
不能依赖于默认构造函数原因:1,当声明其他构造函数时,编译器会认为类的设计者需要控制所有情况下的初始化操作 2,默认初始化可能出错 3,类中包含了其他类型的成员,而该类型没有默认构造函数
=default
要求编译器生成默认构造函数
构造函数初始值列表
构造函数初始值列表中忽略的数据成员以与合成默认构造函数相同的方式进行初始化。
拷贝,赋值和析构
拷贝的时机:初始化变量,int b=a; 函数传值以及返回值(不是引用和指针的时候)
编译器默认合成拷贝,赋值和析构函数
访问说明符
public,private,protected,friend这些说明符可以无限制的出现,控制的范围是到下一次说明符为止。
友元friend: 允许访问私有成员变量和函数
问题
1,在Sales_data中定义read函数的时候,书中提到read函数返回istream的流参数,但是在编程的过程中,发现cin,cout即不能作为参数传入,也不能作为参数返回?
这一块的内容涉及IO库的知识,因为不能对IO对象进行拷贝和赋值,但可以通过引用的方式来传递和返回流。
2,声明和定义在类外部的非成员函数,与类的private成员函数有什么区别?在什么情况下,需要使用定义在类外部的非成员函数?而且,非成员函数还不能直接使用类的私有变量,会增加代码的复杂性。
3,定义在内部的成员函数如果很复杂,也是inline的吗?如何查看一个函数是不是inline了?
4,primer中提到,非成员函数和类声明在同一个文件中,这样,用户使用接口的任何部分都只需要引入一个文件,但是,如果定义类的文件包含定义非成员函数的文件,那么对于用户而言,实际上也是只需要引入一个文件的,这什么理解?
5,当类中包含了没有默认构造函数的其他类时,为什么不能递归的调用默认构造函数,就是为没有默认构造函数的类型合成默认构造函数?
因为类中包含的该类型可能定义了自己的构造函数,因此,编译器就不会为其合成默认的构造函数。
6,如果是带有参数的构造函数声明了=default会有什么影响?
编译时将会报错,提示不是可默认为的特殊成员函数。
7,封装的好处?
用户代码不会无意间破外封装对象的状态;
可以随时改变实现细节,无需调整用户级别的代码;
类的接口和提供一个函数接口有什么区别?在C中没有类的概念,但是提供一个函数接口供别人使用,只要接口不变,同样可以任意的修改实现细节?
8,友元的利弊?