C++非默认构造函数使用问题

li_rui_1220 2015-07-31 01:57:16
有两个类A,B。类A有个非默认构造函数。在类B中定义类A。我想定义类A的时候使用非默认构造函数,总是报错。我该怎么办呢?难道说在类中定义类只能用默认构造函数吗?求指导

class A
{
public
A(int ca); //非默认构造函数
int a;
}
A::A(int ca)
{
a = ca;
}
class B
{
B()
~B()
A aa(10); //报错,非法语句
}
...全文
367 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_rui_1220 2015-08-15
  • 打赏
  • 举报
回复
网上看了下参数初始化列表,我用的有点问题,多个参数初始需要加, 现在问题已解决。非常感谢各位
fefe82 2015-08-15
  • 打赏
  • 举报
回复
引用 22 楼 li_rui_1220 的回复:
[quote=引用 16 楼 lm_whales 的回复:] 既然A类没有定义默认构造函数,那么 C++11标准以前, 类成员变量不能在类定义的同时初始化 只能通过 初始化表初始化. 解决方案:
class A
{
    public 
    A(int ca);                 //非默认构造函数
    int a;
};
A::A(int ca)
{
    a = ca;
}
class B
{
    B();  
    ~B(); 
    A aa; 
 
}; 
 
//可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量

C++11标准 以及以后 类成员变量,可以在定义时候直接初始化。
class A
{
    public 
  A(int ca);                 //非默认构造函数
    int a;
}; 
A::A(int ca)
{
    a = ca;
}

class B
{
    B(); 
    ~B(); 
    A aa{10};    //C++11,成员变量定义时初始化
}; 

B(){}
怎么知道用的是不是C++11标准?我用VC6.0上这样做还是报警[/quote] 扔掉 VC6 吧。去下个 VS2015 community 吧。
li_rui_1220 2015-08-15
  • 打赏
  • 举报
回复
引用 21 楼 GKatHere 的回复:
1: 使用指针 2:A中单独导出一个初始化程序 3:B继承A
我知道1和2两种方法可以实现,目前采用在A中做一个初始化程序,但是还是想弄明白如何使用非默认构造函数啊
li_rui_1220 2015-08-15
  • 打赏
  • 举报
回复
引用 16 楼 lm_whales 的回复:
既然A类没有定义默认构造函数,那么 C++11标准以前, 类成员变量不能在类定义的同时初始化 只能通过 初始化表初始化. 解决方案:
class A
{
    public 
    A(int ca);                 //非默认构造函数
    int a;
};
A::A(int ca)
{
    a = ca;
}
class B
{
    B();  
    ~B(); 
    A aa; 
 
}; 
 
//可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量

C++11标准 以及以后 类成员变量,可以在定义时候直接初始化。
class A
{
    public 
  A(int ca);                 //非默认构造函数
    int a;
}; 
A::A(int ca)
{
    a = ca;
}

class B
{
    B(); 
    ~B(); 
    A aa{10};    //C++11,成员变量定义时初始化
}; 

B(){}
怎么知道用的是不是C++11标准?我用VC6.0上这样做还是报警
GKatHere 2015-08-14
  • 打赏
  • 举报
回复
1: 使用指针 2:A中单独导出一个初始化程序 3:B继承A
707wk 2015-08-14
  • 打赏
  • 举报
回复
没有实例
zilaishuichina 2015-08-14
  • 打赏
  • 举报
回复
请使用 “构成函数初始化列表”
fefe82 2015-08-14
  • 打赏
  • 举报
回复

class A
{
    public 
    A(int ca);                 //非默认构造函数
    int a;
};
A::A(int ca)
{
    a = ca;
}
class B
{
    B() : aa(10) {}
    ~B();
    A aa;
};
lm_whales 2015-08-14
  • 打赏
  • 举报
回复
既然A类没有定义默认构造函数,那么 C++11标准以前, 类成员变量不能在类定义的同时初始化 只能通过 初始化表初始化. 解决方案:
class A
{
    public 
    A(int ca);                 //非默认构造函数
    int a;
};
A::A(int ca)
{
    a = ca;
}
class B
{
    B();  
    ~B(); 
    A aa; 
 
}; 
 
//可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量

C++11标准 以及以后 类成员变量,可以在定义时候直接初始化。
class A
{
    public 
  A(int ca);                 //非默认构造函数
    int a;
}; 
A::A(int ca)
{
    a = ca;
}

class B
{
    B(); 
    ~B(); 
    A aa{10};    //C++11,成员变量定义时初始化
}; 

B(){}
qq_19242821 2015-08-14
  • 打赏
  • 举报
回复
报错的地方改成 A aa; B的构造函数改成 B():aa(10){};
lm_whales 2015-08-14
  • 打赏
  • 举报
回复
既然A类没有定义默认构造函数,那么 C++11标准以前, 类成员变量不能在类定义的同时初始化 只能通过 初始化表初始化. 解决方案:
class A
{
    public 
    A(int ca);                 //非默认构造函数
    int a;
};
A::A(int ca)
{
    a = ca;
}
class B
{
    B();  
    ~B(); 
    A aa; 
 
}; 
 
//可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量

C++11标准 以及以后 类成员变量,可以在定义时候直接初始化。
class A
{
    public 
  A(int ca);                 //非默认构造函数
    int a;
}; 
A::A(int ca)
{
    a = ca;
}

class B
{
    B(); 
    ~B(); 
    A aa{10};    //C++11,成员变量定义时初始化
}; 

B(){}
li_rui_1220 2015-08-14
  • 打赏
  • 举报
回复
引用 12 楼 lm_whales 的回复:
[quote=引用 楼主 li_rui_1220 的回复:] 有两个类A,B。类A有个非默认构造函数。在类B中定义类A。我想定义类A的时候使用非默认构造函数,总是报错。我该怎么办呢?难道说在类中定义类只能用默认构造函数吗?求指导

class A
{
	public 
	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B()
	~B()
	A aa(10);        //报错,非法语句
}

class A
{
	public 
[b]	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B() 
	~B()
	A aa{10};      //报错,非法语句,
                          //C++11  小括号改成大括号 (10 ) 变成  {10},
                          //换成等号应该也行,例如
                           //A aa=10,A aa=A(10)。
                           // 不支持这种语法 的编译器,只能  A aa; 
                           //并且在构造函数的初始化表中,初始化成员变量.

}

//也可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量
[/quote]没看懂您说的,麻烦再详细说下呗!非常感谢
li_rui_1220 2015-08-14
  • 打赏
  • 举报
回复
引用 12 楼 lm_whales 的回复:
[quote=引用 楼主 li_rui_1220 的回复:] 有两个类A,B。类A有个非默认构造函数。在类B中定义类A。我想定义类A的时候使用非默认构造函数,总是报错。我该怎么办呢?难道说在类中定义类只能用默认构造函数吗?求指导

class A
{
	public 
	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B()
	~B()
	A aa(10);        //报错,非法语句
}

class A
{
	public 
[b]	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B() 
	~B()
	A aa{10};      //报错,非法语句,
                          //C++11  小括号改成大括号 (10 ) 变成  {10},
                          //换成等号应该也行,例如
                           //A aa=10,A aa=A(10)。
                           // 不支持这种语法 的编译器,只能  A aa; 
                           //并且在构造函数的初始化表中,初始化成员变量.

}

//也可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量
[/quote]没看懂您说的,麻烦再详细说下呗!非常感谢
lm_whales 2015-08-04
  • 打赏
  • 举报
回复
引用 楼主 li_rui_1220 的回复:
有两个类A,B。类A有个非默认构造函数。在类B中定义类A。我想定义类A的时候使用非默认构造函数,总是报错。我该怎么办呢?难道说在类中定义类只能用默认构造函数吗?求指导

class A
{
	public 
	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B()
	~B()
	A aa(10);        //报错,非法语句
}

class A
{
	public 
[b]	A(int ca);                 //非默认构造函数
	int a;
}
A::A(int ca)
{
	a = ca;
}
class B
{
	B() 
	~B()
	A aa{10};      //报错,非法语句,
                          //C++11  小括号改成大括号 (10 ) 变成  {10},
                          //换成等号应该也行,例如
                           //A aa=10,A aa=A(10)。
                           // 不支持这种语法 的编译器,只能  A aa; 
                           //并且在构造函数的初始化表中,初始化成员变量.

}

//也可以 这么做
B():aa(10){}//初始化表初始化 基类子对象,或者成员变量
lm_whales 2015-08-03
  • 打赏
  • 举报
回复
C++11(标准)以及后续版本,支持 成员变量 定义时候 初始化。 此前很多版本不支持。 所以,在构成函数初始化表里,初始化某些成员变量,是当时的较好的选择。
第九只考拉 2015-08-03
  • 打赏
  • 举报
回复
A aa(10); //报错,非法语句 这一句,aa是类B的一个成员,在定义类成员变量的时候不能给其赋值,如果成员是一个对象的话不能将其实例化。 这种事情可以在构造函数里去做。
二班的码农 2015-07-31
  • 打赏
  • 举报
回复
将类B改成 class B { public: B():aa(10){} ~B(){} A aa; };
li_rui_1220 2015-07-31
  • 打赏
  • 举报
回复
引用 6 楼 ant2012 的回复:
还有你在B类中,构造函数未声明成public,系统默认为private class A { public : A(int ca); //非默认构造函数 int a; }; A::A(int ca) { a = ca; } class B { public: B(); ~B(); A aa(10); //报错,非法语句 };
请在编译器上实验,我只想知道A aa(10); //报错,非法语句报错怎么解决
二班的码农 2015-07-31
  • 打赏
  • 举报
回复
把 A aa(10); 改成 A aa; 不能在类定义时,实例化一个类变量
二班的码农 2015-07-31
  • 打赏
  • 举报
回复
还有你在B类中,构造函数未声明成public,系统默认为private class A { public : A(int ca); //非默认构造函数 int a; }; A::A(int ca) { a = ca; } class B { public: B(); ~B(); A aa(10); //报错,非法语句 };
加载更多回复(5)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧