c++成员函数后面加一个冒号的含义

目录

1.变量初始化方式

1.1 赋值运算符赋值

1.2 括号赋值

1.3 冒号初始化

1.4 使用情况


1.变量初始化方式


1.1 赋值运算符赋值

int a = 10;
char b = 'r';

1.2 括号赋值

int a(10);
char b('r');


但是括号赋值只能在变量定义并初始化中,不能用在变量定义之后再赋值。

1.3 冒号初始化

        有的数据成员需要在构造函数调入之后、函数体执行之前,就进行初始化,比如引用数据成员、常量数据成员、对象数据成员。

        冒号初始化是在给数据成员分配内存空间时、进入函数体之前就进行初始化,也就是说,初始化这个数据成员时函数体还未执行。

        对于在函数体内的初始化,是在所有的数据成员被分配好内存空间后才进行的。

        对比如下两段代码:

// 代码一
class Student
{
    public:
    Student(int, int);
    protected:
    const int a;
    int &b;
};
Student::Student(int i, int j)
{
    a = i;
    b = j;
}

// 代码二
class Student
{
    public:
    Student(int, int);
    protected:
    const int a;
    int &b;
};
Student::Student(int i, int j):a(i), b(j)
{
    
}

        在Student类中有两个数据成员,一个是常量数据成员,一个是引用数据成员。

        代码一中在构造函数中初始化了这两个数据成员,但是这并不能通过编译,因为(1)常量初始化时必须赋值,而且它的值是不能再改变的;(2)引用在初始化时也是需要赋值的,定义了引用之后,它就和引用的目标维系在了一起,也是不能再被赋值的。而上述代码会提示(1)变量a和b没有被初始化;(2)变量a是只读变量,不可以再进行分配。

代码二中使用了冒号初始化的机制,使得在构造函数中使用常量和引用数据成员变为可能。

1.4 使用情况

构造函数后加冒号是初始化表达式:
有四种情况下应该使用初始化表达式来初始化成员:

1:初始化const成员

2:初始化引用成员

3:当调用基类的构造函数,而它拥有一组参数时

4:当调用成员类的构造函数,而它拥有一组参数时。

再举个例子:

#include<iostream.h>
class A
  {  
   public:
        int x;
        A(int a=0){x=a;}
  };
class B1:public A
{
   public:
       int y1;
       B1(int a=0,int b=0):A(b)  //就是这句
       {
           y1=a;   
       }
 };

请问那句后面的 :A(b) 代表什么啊,为什么要跟个B1基类的构造函数?
答:A(b)实际上是做的是用b初始化A的成员x;既x=b; :是初始化列表方式
————————————————
版权声明:本文为CSDN博主「ClaireQi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangxiao7474/article/details/103492062

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值