关于C++构造函数的问题。

关于C++构造函数的问题。,第1张

上面的解答应该是这么回事:当构造函数有形参,而全部形参都提供了默认实参的情况下,也是默认构造函数,因为此时调用此构造函数初始化类时,可以不提供实参。比如:

class A

{

private:

int a;

int b;

public:

A(int x=0,int y=0):a(x),b(y) {}

};

你下面自己的理解❶是对的,形参就是x,y。而❷不正确。因为a,b是类的数据成员。A(int x=0,int y=0):a(x),b(y) {}才包含默认实参。

virtual ~A(void); //析构函数里的virtual是什么意思???

virtual 表示 该 析构函数是虚函数,子类必须重写该方法。虚函数可以只有函数体,而没有任何实现代码。。

B(const A &a); // B的构造函数为什么这样

这个跟A的构造函数一样。。A(const A &other); // 拷贝构造函数

只是参数名不同而已。。

A m_a; // 成员对象是什么意思?

成员对象其实就是一个变量,只不过这个变量是一个结构而已,而且在声明的时候自动初始化。

class类型的变量会在声明的时候默认调用无参构造函数,所以称之为成员对象。

默认构造函数是没有参数,或者是参数有默认值的构造函数。

你的类没有定义构造函数,那么编译器将为你生成一个默认无参数构造函数,但如果你定义了一个构造函数,那么编译器将不为你自动生成默认构造函数,那么你在使用 ClassType objectname;时将没有匹配的构造函数被调用,那么你必须自己定义一个默认构造函数。

定义了2个默认构造函数了,那么就不在使用默认的构造函数,当你在创建对象时候,需要调用一个无参的构造函数。

你好!

子类从基类继承,如果子类构造时不显示调用基类的构造函数,那么系统会使用基类的默认构造函数,但是因为你没有提供默认的构造函数,所以报错了!

你可以在构造函数的参数列表中再加入基类的构造函数调用,或者给基类提供一个默认的构造函数。

打字不易,采纳哦!

回答:

1,

如果没有定义构造函数,系统自动给默认构造函数

如果定义了构造函数,行A就是默认构造函数的形式

2,

如果定义了任何构造函数,2着必须显示的定义在类中

(构造具体执行内容可以放到其他地方,不过要用::来说明属于谁)

3,

为类定义了构造函数后,程序员就必须为它提供默认构造函数--非常正确

下面的例子行BCD都是定义的构造函数,参数可变重载了构造函数

行A就是默认构造函数,行BCD可以任意删除,A行却不行

行BCD全部删除后,A行可以删除

只要有BCD任意一行在,A行就不能删除

#include<iostreamh>

#include<stdlibh>

class temp

{

private:

int x,y,z;

public:

temp (); //默认构造函数 行A

temp (int); //用户定义构造函数 行B

temp (int,int); //用户定义构造函数 行C

temp (int,int,int); //用户定义构造函数 行D

};

void main()

{

temp td(1,2,3);

temp tc(1,2);

temp tb(1);

temp ta;

}

temp::temp ( )

{

cout<<"默认参数的构造函数"<<endl;

}

temp::temp (int a)

{

cout<<"一个参数的构造函数"<<endl;

x=a;

}

temp::temp (int a, int b)

{

cout<<"二个参数的构造函数"<<endl;

x=a;

y=b;

}

temp::temp (int a, int b, int c)

{

cout<<"三个参数的构造函数"<<endl;

x=a;

y=b;

z=c;

}

呵呵,这个问题很有意思,我看Primer的时候也有过相同的疑问。

首先,构造函数是支持重载的,但是构造函数的特征是函数名与类名相同,所以构造函数的区别就在于参数的不同。

另外还有一点就是,如果一个类没有给他写构造函数,那么编译器会给他添上一个

比如举例,一个Person类。

默认构造函数构造对象的时候要运行的构造函数,就是没有参数或者参数有默认值的那个构造函数,每个类都应该有一个这样的函数。

class

Person

{

string

name;

public:

Person(string

str

=

"no");

//带默认参数的构造函数

}

为什么一定要有一个默认构造函数呢?

因为你建立一个新对象的时候就要运行这个函数来构造此对象,当然也可以为带一个参数的。

比如:

class

Person

{

string

name;

public:

Person(string

str);

}

对这个对象,在构造的时候只要加上一个初始值就行了,比如

Person

John("John");

但是如果是数组呢,如Person

student[10]呢,由于没有默认构造函数所以这段代码肯定会出错。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11677177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存