构造函数冒号初始化列表

一. 对象成员必须采用初始化列表方式进行初始化,否则产生错误。
对含有对象成员的对象进行初始化,初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数,具体看下面代码中Student(char *temp):teacher(temp) 这行代码。

cpp代码:
#include <iostream> 
#include <cstring>
using namespace std;     
class Teacher   
{   
    public:   
    Teacher(char *temp)   
    {   
        director = new char[10];   
        strcpy(director,temp);   
    } 
    ~Teacher()   
    {   
        cout<<"free director memory in heap one time."<<endl;   
        delete[] director;   
    }   
    char *show();  
 
    protected:   
    char *director;   
};   
char *Teacher::show()   
{   
    return director;   

class Student   
{   
    public:   
   Student(char *temp):teacher(temp) 
    {   
        number = 1;   
        score = 100;   
    }   
    void show();   
   
    protected:   
    int number;   
    int score;   
    Teacher teacher;       
};   
   
void Student::show()   
{   
    cout<<teacher.show()<<endl<<number<<endl<<score<<endl;   
}  

int main()   
{   
    Student a("hello   world!");   
    a.show();    
}

编译运行后结果:
hello   world!
1
100
free director memory in heap one time.

 

二.对于不含对象成员的对象,初始化时也可以套用上面的格式,给常量成员和引用成员进行初始化。

类成员的构造是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的。C++对变量的初始化允许使用括号方式,int a=10和int a(10)等价,但冒号后是不允许使用=方式只允许()括号方式。

 

代码举例如下:

#include <iostream>   
#include <cstring>   
using namespace std;     
class Teacher   
{   
    public:   
    Teacher(char *temp)   
    {   
        director = new char[10];   
        strcpy(director,temp);   
    } 
    ~Teacher()   
    {   
        cout<<"free director memory in heap one time."<<"\n";   
        delete[] director;   
    }   
    char *show();   
    protected:   
    char *director;   
};   
char *Teacher::show()   
{   
    return director;   

class Student   
{   
    public:   
   Student(char *temp,int &pk,int j):teacher(temp),ps(10),pb(j),pk(pk),pa(pb+5)   
    {   
        number = 1;   
        score = 100; 
    }   
    void show();   
   
    protected:   
    int number;   
    int score;   
    Teacher teacher;    
    const int ps; 
    int &pk; 
    int pa; 
    int pb; 
};       
void Student::show()   
{   
    cout<<teacher.show()<<endl<<"number="<<number<<endl<<"score="<<score<<endl<<"pk="<<pk<<endl<<"ps="<<ps\
  <<endl<<"pa="<<pa<<endl<<"pb="<<pb<<endl;   
}   

int main()   
{   
    char *name="hello   world!"; 
    int mm=678; 
    Student stu(name,mm,34); 
    stu.show(); 
}

编译运行后结果:
hello   world!
number=1
score=100
pk=678
ps=10
pa=11682643
pb=34
free director memory in heap one time.

分析:
由于pa先构造,此时pb还未赋值,所以pa显示出一个随机数。
Student(char *temp,int &pk,int j):teacher(temp),ps(10),pb(j),pk(pk),pa(pb+5)中teacher(temp)是构造函数调用,而ps(10),pb(j),pk(pk),pa(pb+5)是赋值。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值