默认构造函数的问题。

时间:2021-03-12 19:29:12
要怎样写才能写成一个默认构造函数?代码错误在什么地方?
#include <iostream>	
#include <string>
using namespace std;

// for class 类类型隐式转换
// By Evel

class Test
{
public:
//Test(); //默认构造函数一;不能和2同时存在
Test(int i=0,double& n):b(n); //默认构造函数二;声明了i具有默认值。
void Get();
private:
int a;
double& b;
};
Test::Test(int i,double& n):b(n) //类的。只要是类的成员函数,都只能在类声明时对参数赋默认值,不能在实现时赋值。
//如果类内部声明时赋默认值但是在类外也赋值就发生重了定义
{
a=i;
}

void Test::Get()
{
cout << a << endl;
}
void main()
{
Test AA;
double b = 10.2;
Test BB(5,b);
BB.Get();
}

12 个解决方案

#1


默认构造函数是没有参数的!

Test(int i=0,double& n):b(n); 

这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始

#2


要么你不定义任何构造函数,要么 Test(int i=0,double n=0)
上面两种都可以说是默认构造函数

#3


默认构造函数就是你没定义构造函数时候才有的。。
派生类的话会调用父类无参构造函数~

#4


你第2个压根就不是默认构造函数。你这个情况就提供一个无参的构造函数作为默认构造函数就可以了。

#5


 Test(int i=0,double& n):b(n);    //默认构造函数二;声明了i具有默认值。

我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。

#6


楼主没认真看默认参数的语法的章节吧。补课吧。

#7


引用 5 楼 evel 的回复:
Test(int i=0,double&amp; n):b(n); //默认构造函数二;声明了i具有默认值。

我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。


别想了,不可能的。

#8


引用 1 楼 z752964360 的回复:
默认构造函数是没有参数的!

Test(int i=0,double&amp; n):b(n); 

这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始

这代码我调试过了,我也不知道怎么来,不过默认构造函数是允许带参数的,这里怎么引发重定义,我也搞不懂,顶下~~

#9




#include <iostream>    
#include <string>
using namespace std;

class Test
{
public:
//Test(){} //默认构造函数一;不能和2同时存在
Test(int i=0,double n= 10.2)/*:b(n)*/;    //默认构造函数二;声明了i具有默认值。!这里的n不能为引用,初始化列表在不在声明里面,且默认值必须从右往左顺序
void Get();

private:
int a;
double& b;
};


#include "test.h"



Test::Test(int i,double n):b(n)    //类的。只要是类的成员函数,都只能在类声明时对参数赋默认值,不能在实现时赋值。
//如果类内部声明时赋默认值但是在类外也赋值就发生重了定义
{
a=i;
}

void Test::Get()
{
cout << a << endl;
}
void main()
{
Test AA;
double b = 10.2;
Test BB(5,b);
BB.Get();
}

#10


默认构造函数是不带参数的,但是如果你定义了一个构造函数的话,无论你自己定义的构造函数是带参数的还是不带参数的,那么编译器就不再为你提供任何的构造函数了。上面你既然自己定义了构造函数的话,那么那来的默认的构造函数呢?既然是默认的,那么就是编译器为了自动生成的。不是你写的,如果你想让那个b有个初始值的话,你可以在函数体内来对那个b附个初值就可以了,或者是你用带缺省参数的构造函数来做不就可以了。

#11


还有一点就是构造函数 也是函数,那么它也是可以重载的。

#12


一楼的理解我不赞同。
无须输入参数的构造函数都可以作为默认构造函数,并不等于无参构造函数.

如果一个构造函数带有参数,但是这个参数具有默认值,那么这个构造函数也可以作为默认构造函数。不是吗?

我这里是改成这样:但是问题来了:我的double没有初始化到一个引用上。而是一个随机地址。

#include <iostream>	
#include <string>
using namespace std;

// for class 类类型隐式转换
// By Evel

class Test
{
public:
//Test(); //默认构造函数一;不能和2同时存在
Test(int i=0,double n=0); //默认构造函数二的声明;声明了i具有默认值。这里不用将b(n)附上;
void Get();
private:
int a;
double& b;
};
Test::Test(int i,double n):b(n) //类的。只要是类的成员函数,都只能在类声明时对参数赋默认值,不能在实现时赋值。//如果类内部声明时赋默认值但是在类外也赋值就发生重了定义
{
a=i;

}

void Test::Get()
{
cout << a << endl;
cout << b << endl;
}
void main()
{
Test AA;
double b = 10.2;
Test BB(5,b);
BB.Get();
}

#1


默认构造函数是没有参数的!

Test(int i=0,double& n):b(n); 

这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始

#2


要么你不定义任何构造函数,要么 Test(int i=0,double n=0)
上面两种都可以说是默认构造函数

#3


默认构造函数就是你没定义构造函数时候才有的。。
派生类的话会调用父类无参构造函数~

#4


你第2个压根就不是默认构造函数。你这个情况就提供一个无参的构造函数作为默认构造函数就可以了。

#5


 Test(int i=0,double& n):b(n);    //默认构造函数二;声明了i具有默认值。

我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。

#6


楼主没认真看默认参数的语法的章节吧。补课吧。

#7


引用 5 楼 evel 的回复:
Test(int i=0,double&amp; n):b(n); //默认构造函数二;声明了i具有默认值。

我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。


别想了,不可能的。

#8


引用 1 楼 z752964360 的回复:
默认构造函数是没有参数的!

Test(int i=0,double&amp; n):b(n); 

这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始

这代码我调试过了,我也不知道怎么来,不过默认构造函数是允许带参数的,这里怎么引发重定义,我也搞不懂,顶下~~

#9




#include <iostream>    
#include <string>
using namespace std;

class Test
{
public:
//Test(){} //默认构造函数一;不能和2同时存在
Test(int i=0,double n= 10.2)/*:b(n)*/;    //默认构造函数二;声明了i具有默认值。!这里的n不能为引用,初始化列表在不在声明里面,且默认值必须从右往左顺序
void Get();

private:
int a;
double& b;
};


#include "test.h"



Test::Test(int i,double n):b(n)    //类的。只要是类的成员函数,都只能在类声明时对参数赋默认值,不能在实现时赋值。
//如果类内部声明时赋默认值但是在类外也赋值就发生重了定义
{
a=i;
}

void Test::Get()
{
cout << a << endl;
}
void main()
{
Test AA;
double b = 10.2;
Test BB(5,b);
BB.Get();
}

#10


默认构造函数是不带参数的,但是如果你定义了一个构造函数的话,无论你自己定义的构造函数是带参数的还是不带参数的,那么编译器就不再为你提供任何的构造函数了。上面你既然自己定义了构造函数的话,那么那来的默认的构造函数呢?既然是默认的,那么就是编译器为了自动生成的。不是你写的,如果你想让那个b有个初始值的话,你可以在函数体内来对那个b附个初值就可以了,或者是你用带缺省参数的构造函数来做不就可以了。

#11


还有一点就是构造函数 也是函数,那么它也是可以重载的。

#12


一楼的理解我不赞同。
无须输入参数的构造函数都可以作为默认构造函数,并不等于无参构造函数.

如果一个构造函数带有参数,但是这个参数具有默认值,那么这个构造函数也可以作为默认构造函数。不是吗?

我这里是改成这样:但是问题来了:我的double没有初始化到一个引用上。而是一个随机地址。

#include <iostream>	
#include <string>
using namespace std;

// for class 类类型隐式转换
// By Evel

class Test
{
public:
//Test(); //默认构造函数一;不能和2同时存在
Test(int i=0,double n=0); //默认构造函数二的声明;声明了i具有默认值。这里不用将b(n)附上;
void Get();
private:
int a;
double& b;
};
Test::Test(int i,double n):b(n) //类的。只要是类的成员函数,都只能在类声明时对参数赋默认值,不能在实现时赋值。//如果类内部声明时赋默认值但是在类外也赋值就发生重了定义
{
a=i;

}

void Test::Get()
{
cout << a << endl;
cout << b << endl;
}
void main()
{
Test AA;
double b = 10.2;
Test BB(5,b);
BB.Get();
}