一. 对象成员必须采用初始化列表方式进行初始化,否则产生错误。
对含有对象成员的对象进行初始化,初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数,具体看下面代码中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)是赋值。