目录
一、构造类成员
问个问题:在一个类中,如果有用户自定义的类对象作为其成员,那构造函数怎么做呢?
举个栗子,下面的程序定义了学号类和学生类,学生类中包含有学号类:
int nextStudentID = 0;
class StudentID
{
public:
StudentID()
{
value = ++nextStudentID;
cout << "Assigning student id " << value << endl;
}
~StudentID()
{
--nextStudentID;
cout << "Destructing id " << value << endl;
}
protected:
int value;
};
class Student
{
public:
Student(string Name = "noName")
{
cout << "Constructing student " << Name << endl;
name=Name;
}
protected:
string name;
StudentID id;
};
int main()
{
Student s("Randy");
return 0;
};
二、冒号语法(C++定义的一个新构造方式)
1、举个栗子:
#include <iostream>
using namespace std;
class StudentID
{
public:
StudentID(int id=0)
{
value=id;
cout<<"Assigning student id " << value <<endl;
}
~StudentID()
{
cout<<"Destructing id " <<value<<endl;
}
protected:
int value;
};
class Student
{
public:
Student(string Name="noName", int ssID=0):id(ssID)
{
cout<<"Constructing student "<<Name<<endl;
name=Name;
}
protected:
string name;
StudentID id;
};
int main()
{
Student s("Randy", 9818);
Student t("Jenny");
return 0;
}
特别说明:在Student构造函数头的后面,冒号表示后面要对类的数据的构造函数进行调用。Student构造函数头冒号后面如 果是id()的形式,:id()可以省略。
2、冒号后面跟的是赋值,这种写法是C++的特性。
老规矩,看栗子:
A( int aa, int bb ):a(aa),b(bb) { /-/ } 相当于 A( int aa, int bb ) { a=aa; b=bb; }
3、构造函数后加冒号是初始化表达式:
有四种情况下应该使用初始化表达式来初始化成员:
(1):初始化const成员
(2):初始化引用成员
(3):当调用基类的构造函数,而它拥有一组参数时
(4):当调用成员类的构造函数,而它拥有一组参数时。
4、在程序中定义变量并初始化的机制中,有两种形式
(1)传统的初始化的形式,即赋值运算符赋值;还有一种是括号赋值。
例:
int a=10;
char b='r';//赋值运算符赋值
int a(10);/
char b('r');//括号赋值
以上定义并初始化的形式是正确的,可以通过编译,但括号赋值只能在变量定义并初始化中,不能用在变量定义后再赋值。
(2)冒号初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。 对于在函数中初始化,是在所有的数据成员被分配内存空间后才进行的。
这样是有好处的,有的数据成员需要在构造函数调入之后函数体执行之前就进行初始化如引用数据成员,常量数据成员和对象数据成员。