#include<iostream>
using namespace std;
/**
*成员列表初始化
*/
class Girl{
private:
string m_strName;
bool m_bBf;//单身否 0 1
int m_nAge;
public:
Girl(void);
Girl(string strName,bool bBf,int nAge);
void Show(void)
{
cout<<"Her Name:"<<m_strName<<",今年多少岁"<<m_nAge<<(m_bBf?"Yes":"No")<<endl;
}
};
//类外初始化,给对象赋值
Girl::Girl(void):m_strName("yiyi"),m_nAge(0),m_bBf(false){}
Girl::Girl(string strName,bool bBf,int nAge):m_strName(strName),m_bBf(bBf),m_nAge(nAge){}
int main()
{
Girl gl;
gl.Show();
Girl g2("凤姐姐",33,false);
g2.Show();
return 0;
}
在程序中定义变量并初始化的机制中,有两种形式,一个是我们传统的初始化的形式,即赋值运算符赋值,还有一种是括号赋值,如:
int a=10;
char b='r';//赋值运算符赋值
int a(10);/
char b('r');//括号赋值
以上定义并初始化的形式是正确的,可以通过编译,但括号赋值只能在变量定义并初始化中,不能用在变量定义后再赋值,这是和赋值运算符赋值的不同之处,如:
(1)
int a; //先定义一个变量
......
a=10; //根据需要赋值
(2)
int b; //先定义一个变量
......
b(10); //和(1)一样根据需要赋值
(1)是可以用通过编译,定义一个变量a但并没有初始化,在需要变量a的时候,通过赋值运算符把10赋给a,而在(2)中,是通过括号把10赋值给b,但编译系统认为
这是一个函数的调用,函数名为b,10为实际参数,所以编译错误。因此,括号赋值只用在定义变量并初始化中。
现在我们来看构造函数中冒号初始化和函数初始化的问题,类构造函数的作用是创建一个类的对象时,调用它来构造这个类对象的数据成员,一要给出此数据成员分配内存空间,二是要给函数数据成员初始化,构造数据成员是按数据成员在类中声明的顺序进行构造。
冒号初始化与函数体初始化的区别在于:
冒号初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。
对于在函数中初始化,是在所有的数据成员被分配内存空间后才进行的。
这样是有好处的,有的数据成员需要在构造函数调入之后函数体执行之前就进行初始化如引用数据成员,常量数据成员和对象数据成员,看下面的一段程序:
class student
{public :
student (int,int) ;
.
.
.
protected:
const int a;
int &b;
}
student ::student (int i,int j)
{
a=i;
b=j;
}
在Student类中有两个数据成员,一个是常量数据成员,一个是引用数据成员,并且在构造函数中初始化了这两个数据成员,但是这并不能通过编译, 因为常量初始化时必须赋值,它的值是不能再改变的,与常量一样引用初始化也需要赋值,定义了引用后,它就和引用的目标维系在了一起,也是不能再被赋值的。 所以C++":"后初始化的机制,使引用和常量数据成员变为可能的,Student类的构造函数应为:
student ::student(int i,int j):a(i),b(j){}
在下面的程序:
class teach
{
public :
teach(char *p="name",int a=0)
.
.
.
protected:
char name[30];
int age;
}
teach ::teach(char*p,int a)
{
strcopy(name ,p);
age=a;
cout>>name>>endl;
}
class student
{
public:
student (char *p="name");
.
.
.
protected;
char name[30];
teach teacher;
};
student::student(char *p)
{
strcopy(name,p);
cont>>name>>endl;
}
在上面的程序中通不过编译,编译系统会告诉你teacher这个类对象缺默认构造函数,因为在teach 类中没有定义默认的构造函数。那么带参数的构造函数怎么进行构造呢?通过我们前面提到的冒号赋值。那它的构造函数应该是:
student::student(char *p,char *pl,int ag):teacher(pl,ag)
{
strcopy(name,p);
cont>>name>>endl;
}
就是说在没有默认构造函数的时候,如果一个类对象是另一个类的数据成员,那么初始化这个数据成员,就应该放到冒号后面。这样可以带参数。在类的定义中,如:
protected;
char name[30];
teach teacher
类对象是不能带参数的,因为它只是声明。
所以在C++中就增加了这种机制,这是面向对象编程所必须的。
int a=10;
char b='r';//赋值运算符赋值
int a(10);/
char b('r');//括号赋值
以上定义并初始化的形式是正确的,可以通过编译,但括号赋值只能在变量定义并初始化中,不能用在变量定义后再赋值,这是和赋值运算符赋值的不同之处,如:
(1)
int a; //先定义一个变量
......
a=10; //根据需要赋值
(2)
int b; //先定义一个变量
......
b(10); //和(1)一样根据需要赋值
(1)是可以用通过编译,定义一个变量a但并没有初始化,在需要变量a的时候,通过赋值运算符把10赋给a,而在(2)中,是通过括号把10赋值给b,但编译系统认为
这是一个函数的调用,函数名为b,10为实际参数,所以编译错误。因此,括号赋值只用在定义变量并初始化中。
现在我们来看构造函数中冒号初始化和函数初始化的问题,类构造函数的作用是创建一个类的对象时,调用它来构造这个类对象的数据成员,一要给出此数据成员分配内存空间,二是要给函数数据成员初始化,构造数据成员是按数据成员在类中声明的顺序进行构造。
冒号初始化与函数体初始化的区别在于:
冒号初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。
对于在函数中初始化,是在所有的数据成员被分配内存空间后才进行的。
这样是有好处的,有的数据成员需要在构造函数调入之后函数体执行之前就进行初始化如引用数据成员,常量数据成员和对象数据成员,看下面的一段程序:
class student
{public :
student (int,int) ;
.
.
.
protected:
const int a;
int &b;
}
student ::student (int i,int j)
{
a=i;
b=j;
}
在Student类中有两个数据成员,一个是常量数据成员,一个是引用数据成员,并且在构造函数中初始化了这两个数据成员,但是这并不能通过编译, 因为常量初始化时必须赋值,它的值是不能再改变的,与常量一样引用初始化也需要赋值,定义了引用后,它就和引用的目标维系在了一起,也是不能再被赋值的。 所以C++":"后初始化的机制,使引用和常量数据成员变为可能的,Student类的构造函数应为:
student ::student(int i,int j):a(i),b(j){}
在下面的程序:
class teach
{
public :
teach(char *p="name",int a=0)
.
.
.
protected:
char name[30];
int age;
}
teach ::teach(char*p,int a)
{
strcopy(name ,p);
age=a;
cout>>name>>endl;
}
class student
{
public:
student (char *p="name");
.
.
.
protected;
char name[30];
teach teacher;
};
student::student(char *p)
{
strcopy(name,p);
cont>>name>>endl;
}
在上面的程序中通不过编译,编译系统会告诉你teacher这个类对象缺默认构造函数,因为在teach 类中没有定义默认的构造函数。那么带参数的构造函数怎么进行构造呢?通过我们前面提到的冒号赋值。那它的构造函数应该是:
student::student(char *p,char *pl,int ag):teacher(pl,ag)
{
strcopy(name,p);
cont>>name>>endl;
}
就是说在没有默认构造函数的时候,如果一个类对象是另一个类的数据成员,那么初始化这个数据成员,就应该放到冒号后面。这样可以带参数。在类的定义中,如:
protected;
char name[30];
teach teacher
类对象是不能带参数的,因为它只是声明。
所以在C++中就增加了这种机制,这是面向对象编程所必须的。
分享到:
相关推荐
### C++构造函数初始化列表详解 在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类...
本文将深入探讨C++构造函数中的初始化,包括传统的赋值方式、括号赋值、冒号初始化(也称为成员初始化列表)以及函数体初始化。 首先,C++中存在两种初始化方式:赋值运算符赋值和括号赋值。例如: ```cpp int a =...
在C++中,有两种主要类型的构造函数初始化:直接初始化和复制初始化。直接初始化是在创建对象时直接提供值,如`MyClass obj(value)`。复制初始化则涉及到一个已存在对象的值被用于初始化新的对象,如`MyClass obj = ...
对于内置类型(如int、float等),在初始化列表中初始化与在构造函数体内部赋值差异不大,但对于类类型,使用初始化列表可以避免先调用默认构造函数再赋值的过程。例如,如果一个类有多个数据成员,不使用初始化列表...
C++类构造函数初始化列表是创建对象时执行成员变量初始化的一种机制,它的主要作用在于确保对象的成员变量在构造函数的执行体之前被正确初始化。初始化列表以冒号开始,随后列出成员变量及其对应的初始化表达式,每...
在C++中,构造函数的初始化列表是构造函数体外使用冒号":"后跟一个或多个初始化器的列表。初始化列表用于初始化类的成员变量。C++标准建议使用初始化列表来初始化成员变量,因为这样做通常会更高效,可以避免先默认...
- 在构造函数的主体之前,使用冒号 `:` 分隔符后跟一系列初始化表达式。 - 初始化列表中的每个成员变量都会按照指定的方式初始化。 - **示例**: ```cpp class MyClass { public: int x; int y; int z; ...
- 构造函数初始化列表:在构造函数的定义中,冒号后跟随的是初始化列表,用于在对象创建时对成员变量进行初始化,特别是对于常量成员或需要特殊初始化的成员。 - 访问控制修饰符:`public:`和`private:`后的冒号...
- 总是在构造函数中使用初始化列表,除非你希望成员保持默认构造的状态。 - 初始化列表应优先于构造函数体内的赋值操作,以减少不必要的成员变量初始化。 - 为静态和常量成员提供初始化列表。 - 确保初始化列表...
而`new`是C++的运算符,它不仅分配内存,还会调用相应的构造函数初始化对象,释放内存时使用`delete`。 构造函数的一个关键用途是初始化成员变量,它们按声明顺序自动初始化,即使在初始化列表中顺序不同。当声明...
首先,我们来看C++中如何在构造函数的成员初始化列表中初始化类的成员。成员初始化列表是一种特殊的语法结构,允许我们在构造函数定义的括号内,以冒号(:)开头,列出成员变量和它们的初始值。这种方式比在构造函数体...
冒号和双冒号是C++中极其重要的符号,它们在位域定义、构造函数初始化列表、访问控制限定符、类的继承声明等方面都有着广泛的应用。正确理解和掌握这些符号的使用方法,对于编写高效、可维护的C++代码至关重要。
C++初始化函数列表,也称为构造函数初始化列表,是C++编程中用于初始化类的成员变量的一个关键机制,尤其在处理引用类型、const修饰的成员以及没有默认构造函数的类类型成员时显得尤为重要。初始化列表在类的构造...
初始化列表的基本语法是通过在构造函数的括号内使用冒号(:)后跟随一组以逗号分隔的成员变量名和它们的初始值。例如: ```cpp class MyClass { public: int a; double b; MyClass(int x, double y) : a(x), b(y...
本资源摘要信息主要讲解了C++语言中的类和对象相关知识点,涵盖了构造函数、析构函数、对象的初始化、参数传递、默认参数、构造函数的重载等内容。 一、类和对象的概念 在C++语言中,类是对对象的抽象描述,而对象...
在C++编程中,初始化列表是一种非常重要的概念,特别是在创建对象和定义类的构造函数时。这个主题主要涉及如何在创建对象时有效地设置其数据成员的初始值。让我们深入探讨一下初始化列表及其在C++中的应用。 首先,...
当我们创建一个类的对象,并且想要使用初始化列表来指定成员变量的初始值时,我们可以在构造函数声明中使用冒号后跟初始化列表的方式。例如: ```cpp class AnotherClass { public: AnotherClass(int val1, int ...
在C++编程语言中,类的构造函数是至关重要的,它是用来初始化类对象的特殊成员函数。构造函数的名称与类名相同,并且没有返回类型。在这个【标题】"C++ 类的构造函数详解及实例"中,我们将深入探讨构造函数的几个...