tianliangcsdn 于 2016.04.12 09:36 提问

c++下面两种构造函数的实现方式有什么区别？为什么？（ 请说详细点 谢谢）

c++下面两种构造函数的实现方式有什么区别？为什么？（ 请说详细点 谢谢）

{ //构造函数的第一种实现方式

``````cout<<date<<"\t#"<<id<<"is created"<<endl;
``````

}

{ //构造函数的第二种实现方式
id=id;
balance=0;
rate=rate;
lastdate=date;
accumulation=0;
cout<<date<<"\t#"<<id<<"is created"<<endl;
}

5个回答

noahzuo   2016.04.12 09:52

1. 先看简单类成员的初始化：
`````` class Animal
{
public:
Animal(int weight,int height):       //A初始化列表
m_weight (weight),
m_height (height)
{
}
Animal(int weight,int height)       //B函数体内初始化
{
m_weight = weight;
m_height = height;
}
private:
int m_weight ;
int m_height ;
};

``````

1. 再看看继承关系中的构造函数：
`````` class Animal
{
public:
Animal(int weight,int height):        //没有提供无参的构造函数
m_weight (weight),
m_height (height)
{
}
private:
int m_weight ;
int m_height ;
};

class Dog: public Animal
{
public:
Dog(int weight,int height,int type)   //error 构造函数 父类Animal无合适构造函数
{
}
private:
int m_type ;
};

``````

`````` class Dog: public Animal
{
public:
Dog(int weight,int height,int type):
Animal (weight, height)         //必须使用初始化列表增加对父类的初始化
{
}
private:
int m_type ;
};

``````
1. const成员必须在初始化列表中初始化 很简单，const成员是不可以修改的，因此只可以在初始化列表中进行初始化。
`````` class Dog: public Animal
{
public:
Dog(int weight,int height,int type):
Animal (weight, height),
LEGS (4)                 //必须在初始化列表中初始化
{
//LEGS = 4;           //error
}
private:
int m_type ;
const int LEGS;
};

``````
1. 自定义成员在初始列表中进行初始化时将大大提升效率
``````class Food
{
public:
Food(int type = 10)
{
m_type = 10 ;
}
Food(Food &other)                  //拷贝构造函数
{
m_type = other. m_type;
}
Food & operator =( Food &other )      // 重载赋值=函数
{
m_type = other. m_type;
return * this;
}
private:
int m_type ;
};
``````
• 构造函数赋值方式 初始化成员对象m_food
``````class Dog: public Animal
{
public:
Dog(Food &food)
{
m_food = food;                //初始化 成员对象
}
private:
Food m_food;
};

``````

• 构造函数初始化列表方式
`````` class Dog: public Animal
{
public:
Dog(Food &food)
:m_food (food)                   //初始化 成员对象
{
//m_food = food;
}
private:
Food m_food;
};

``````

noahzuo 回复tianliangcsdn: 你应该是新手吧，代码里有些地方还需要改进。最大的问题就是类型转换，你在double和int之间进行了太多操作，来来往往的隐式类型转换可能会带来问题。
2 年多之前 回复
noahzuo 回复tianliangcsdn: 你应该是新手吧，代码里有些地方还需要改进。最大的问题就是类型转换，你在double和int之间进行了太多操作，来来往往的隐式类型转换可能会带来问题。
2 年多之前 回复
tianliangcsdn 完整代码如下，为什么当我用在构造函数中赋值的方式时是不对的呀？
2 年多之前 回复
tianliangcsdn   2016.04.12 10:00

class Savingaccount //个人银行账户管理系统
{
private:
int id;
double balance;
double rate;
int lastdate;
double accumulation;
void record(int date,double amount);
double accumulate(int date)const{
return accumulation+balance*(date-lastdate);
}
public:
Savingaccount(int date,int id,double rate);
int getId(){return id;}
double getBalance(){return balance;}
double getRate(){return rate;}
void deposit(int date,double amount);
void withdraw(int date,double amount);
void settle(int date);
void show();
};
Savingaccount::Savingaccount(int date,int id,double rate)//:id(id),balance(0),rate(rate),lastdate(date),accumulation(0)
{ //构造函数的第二种实现方式
id=id;
balance=0;
rate=rate;
lastdate=date;
accumulation=0;
cout< }
void Savingaccount::record(int date,double amount){
accumulation=accumulate(date);
lastdate=date;
amount=floor(amount*100+0.5)/100;//保留小数点后两位数
balance+=amount;
cout }
void Savingaccount::deposit(int date,double amount){
record(date,amount);
}
void Savingaccount::withdraw(int date,double amount){
if(amount>getBalance())
cout<<"eror:not enough money "<<endl;
else
record(date,-amount);
}
void Savingaccount::settle(int date){
double interest=accumulate(date)*rate/365;
if(interest!=0)
record(date,interest);
accumulation=0;
}
void Savingaccount::show(){
cout<<"#"<<id<<"\tbalance:"<<balance;
}
int main(){
Savingaccount sa0(1,21325302,0.015);
Savingaccount sa1(1,58320212,0.015);
sa0.deposit(5,5000);
sa1.deposit(25,10000);
sa0.deposit(45,5500);
sa1.withdraw(60,4000);
sa0.settle(90);
sa1.settle(90);
sa0.show();cout<<endl;
sa1.show();cout<<endl;
system("pause");
return 0;
}

beifengche   2016.04.12 10:08

int a = 10；

into a;
a = 10;

qq_31597573 回复tianliangcsdn: Savingaccount::Savingaccount(int m_date, int m_id, double m_rate)，把参数的名字改改，不要和成员变量名一致，就可以了
2 年多之前 回复
tianliangcsdn 上面评论里给出的完整代码用第二种方法为什么运行结果不对呀？
2 年多之前 回复
qq_31597573   2016.04.12 10:19

{
public:
School(int number,int area,Student stu,int location):m_number(number),m_area(area),m_stu(stu)
{
m_location=location;
}
private:
const int m_number;
int& m_area;
Student m_stu;//Student类没有默认构造函数，但是有默认拷贝构造函数。
int m_location;
}

{
public:
School(Student stu):m_stu(stu)//只调用拷贝构造函数
{
// m_stu=stu;//调用构造函数+赋值操作
}
private:
Student m_stu;//Student类有默认构造函数，有默认拷贝构造函数。

``````}
``````

sunnyloves   2016.04.12 13:04

c++11的话直接声明之后就可以初始化了

`````` class Animal
{
public:
.
private:
int m_weight  = 1;
int m_height  = 2;
};
``````

mysqld is the server executable (one of them)   #服务执行工具    mysql is the command line client  # 客户端工具   查询用mysqladmin is a maintainance or administrative utility  # 运维和管理工具...

java实现线程的两种方法有什么区别？

c语言判断语句if（n==1）与if(1==n)的区别