概述
目录
一、形参列表
1、形参列表、构造函数体内、变量声明时 赋值的区别
(1) 形参列表
(2) 构造函数体内
(3) 变量声明
2、必须放初始化列表进行初始化的三种情况
(1) 没有默认构造函数的自定义类
(2) 引用
(3) const修饰的成员变量
二、explicit关键字
三、static成员
1、静态成员的特性
2、静态成员函数的特性
一、形参列表
形参列表的作用是给成员变量赋初值,在构造函数的末尾,以一个冒号开始,变量之间以分号隔开,括号中放初始值
但是赋值的话,我们不是可以在构造函数内部对变量 “初始化” 吗,我们甚至还能在声明的时候赋值。下面就需要了解一下,形参列表赋值,和其他方式的赋值有什么区别
1、形参列表、构造函数体内、变量声明时 赋值的区别
(1) 形参列表
形参列表就算不写,编译器也会自动生成一份;有些变量尽管没有在形参列表初始化,编译的时候依然会自动补上
值得注意的是,形参列表只能初始化一次,也就是只能赋值一次
但是下面三种情况或者类型,必须要进行初始化,而且只能在形参列表初始化
(1) 没有默认构造函数的自定义类
(2) 引用
(3) const修饰
(2) 构造函数体内
构造函数体准确说,变量并不是被初始化了,而是被再次赋值了
在进入函数体之前,会先经过形参列表,这里虽然没写,但是编译器会自动生成一份
等到进入函数体内部,只不过是把原本的值给覆盖了
(3) 变量声明
下面这种写法乍一看是在给numbers赋初值,这种说法并不严谨,其实这是C++11引入的新特性,这是在给numbers赋缺省值
2、必须放初始化列表进行初始化的三种情况
(1) 没有默认构造函数的自定义类
上面提到,形参列表即便不写,编译器也会自动生成(如下),但是这个时候会调用默认构造函数
Animal():cat()
如果这个时候没有默认构造函数,那就必须通过形参来初始化了
Animal(Cat cat):_cat(cat)
这个时候就会调用有参构造函数
(2) 引用
引用相当于给一个变量起别名,既然是起别名,那就必须要知道是给谁起别名,这就要求引用在初始化的时候绑定一个变量
但是为什么只能放形参列表呢??
因为一旦进入到函数体内部,那就是赋值了,而不是初始化
(3) const修饰的成员变量
和引用类似,const修饰的变量必须在声明的时候就绑定一个变量或者常量
进入到构造函数的函数体内,实际是赋值,相当于要改变 变量的值
所以只能放在形参列表初始化
二、explicit关键字
假设我们要通过有参构造函数来初始化一个对象,我们多数会通过下面这种方式来实现
对象能否通过等号'='来初始化,答案是可以的!
尽管如此,这种实现方式的可读性较差,我们不希望自己定义的类支持这种写法,所以我们可以在构造函数的前面加上 explicit关键字
三、static成员
static修饰的成员变量,称为静态成员变量;static修饰的成员函数,称为静态成员函数
==》静态成员函数/变量 属于类的一部分,但是不属于对象
1、静态成员的特性
(1) static修饰的成员变量在 全局变量区,不属于任何实例,所以static修饰的成员变量必须在类外被初始化,而且不带static
(2) 类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象,所有这些对象的静态数据成员都共享这一块静态存储空间
(3) 类静态成员可以使用 类名::静态成员 或者 对象.静态成员 来访问
2、静态成员函数的特性
静态成员没有隐藏的 this指针,无法访问任何非静态成员。假设有一个Person类,walk函数想要调用静态成员函数 print。
class Person{
public:
static void print(int z) { // 没有隐藏的this指针
print(?, 1, 2); // 缺少this指针
}
void walk(Person* this, int x,int y) {} // 有一个隐藏的this指针,无需我们显式传递
};
因为没有this指针,所以静态成员函数就无法调用非静态成员函数
最后
以上就是活泼板凳为你收集整理的类和对象 —— 形参列表、explicit、static成员一、形参列表二、explicit关键字三、static成员的全部内容,希望文章能够帮你解决类和对象 —— 形参列表、explicit、static成员一、形参列表二、explicit关键字三、static成员所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复