类和对象 —— 形参列表、explicit、static成员


目录

一、形参列表

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指针,所以静态成员函数就无法调用非静态成员函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值