#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);
这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始
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这个引用类型具有一个默认值。但是不知道怎么会有问题。
我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。
#6
楼主没认真看默认参数的语法的章节吧。补课吧。
#7
别想了,不可能的。
#8
这代码我调试过了,我也不知道怎么来,不过默认构造函数是允许带参数的,这里怎么引发重定义,我也搞不懂,顶下~~
#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没有初始化到一个引用上。而是一个随机地址。
无须输入参数的构造函数都可以作为默认构造函数,并不等于无参构造函数.
如果一个构造函数带有参数,但是这个参数具有默认值,那么这个构造函数也可以作为默认构造函数。不是吗?
我这里是改成这样:但是问题来了:我的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);
这个默认参数不对吧?带默认值的参数应该从参数列表的右边开始
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这个引用类型具有一个默认值。但是不知道怎么会有问题。
我这里主要是想让b这个引用类型具有一个默认值。但是不知道怎么会有问题。
#6
楼主没认真看默认参数的语法的章节吧。补课吧。
#7
别想了,不可能的。
#8
这代码我调试过了,我也不知道怎么来,不过默认构造函数是允许带参数的,这里怎么引发重定义,我也搞不懂,顶下~~
#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没有初始化到一个引用上。而是一个随机地址。
无须输入参数的构造函数都可以作为默认构造函数,并不等于无参构造函数.
如果一个构造函数带有参数,但是这个参数具有默认值,那么这个构造函数也可以作为默认构造函数。不是吗?
我这里是改成这样:但是问题来了:我的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();
}