问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++对象:构造函数

发布网友 发布时间:2022-06-12 10:11

我来回答

3个回答

热心网友 时间:2023-10-09 00:51

/* 构造函数: 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作
eg: Counter c1;
编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象,初始化之后c1的m_value值设置为0
故:构造函数的作用:初始化对象的数据成员。*/
class Counter
{
public: // 类Counter的构造函数,以类名作为函数名,无返回类型
Counter(){
m_value = 0;
}
private:
int m_value; // 类私有的数据成员
}

//二、 构造函数的种类
#include <iostream>
using namespace std;
class Complex
{
private :
double m_real;
double m_imag;
public:
//*无参数构造函数
// 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做
// 只要你写了一个下面的某一种构造函数,系统就不会再自动生成这样一个默认的构造函数,如果希望有一个这样的无参构造函数,则需要自己显示地写出来
Complex(void)
{ m_real = 0.0;
m_imag = 0.0;
}
//*一般构造函数(也称重载构造函数)
//一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参数的个数或者类型不同(基于c++的重载函数原理)
//例如:你还可以写一个 Complex(int num)的构造函数出来,创建对象时根据传入的参数不同调用不同的构造函数
Complex(double real, double imag)
{ m_real = real;
m_imag = imag;
}
//*复制构造函数(也称为拷贝构造函数)
//复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
//若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,具体原因在有关 “浅拷贝”、“深拷贝”的文章中论述
Complex(const Complex & c)
{ // 将对象c中的数据成员值复制过来
m_real = c.m_real;
m_imag = c.m_imag;
}
//*类型转换构造函数,根据一个指定的类型的对象创建一个本类的对象,需要注意的一点是,这个其实就是一般的构造函数,但是对于出现这种单参数的构造函数,C++会默认将参数对应的类型转换为该类类型,
//有时候这种隐私的转换是我们所不想要的,所以需要使用explicit来*这种转换。
//例如:下面将根据一个double类型的对象创建了一个Complex对象
Complex(double r)
{ m_real = r;
m_imag = 0.0;
}
// 等号运算符重载(也叫赋值构造函数)
// 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建。
// 若没有显示的写 =运算符重载,则系统也会创建一个默认的=运算符重载,只做一些基本的拷贝工作
Complex &operator=(const Complex &rhs )
{ // 首先检测等号右边的是否就是左边的对象本身,若是本对象本身,则直接返回
if ( this == &rhs )
{ return *this;
}
// 复制等号右边的成员到左边的对象中
this->m_real = rhs.m_real;
this->m_imag = rhs.m_imag;
// 把等号左边的对象再次传出,目的是为了支持连等 eg:a=b=c 系统首先运行 b=c 然后运行 a=(b=c的返回值,这里应该是复制c值后的b对象)
return *this;
}
};
//三、使用上面定义的类对象来说明各个构造函数的用法:
int main()
{
// 调用了无参构造函数,数据成员初值被赋值为0.0
Complex c1,c2;
// 调用一般构造函数,数据成员初值分别被赋为指定值
Complex c3(1.0,2.5);
// 当然,也可以使用下面的形式
// Complex c3 = Complex(1.0,2.5);
// 把c3的数据成员的值赋值给事先被创建的对象c1
// 由于c1已经事先被创建,故此处不会调用任何构造函数
// 只会调用 = 号运算符重载函数
c1 = c3;
// 调用类型转换构造函数
// 系统首先调用类型转换构造函数,将5.2创建为一个本类的临时对象,然后调用等号运算符重载,将该临时对象赋值给c2
c2 = 5.2;
// 调用拷贝构造函数( 有下面两种调用方式)
Complex c5(c3);
Complex c4 = c3;
// 注意和 =运算符重载的区分,这里等号左边的对象不是事先已经创建,故需要调用拷贝构造函数,参数为c2
// 这一点特别重要,这儿是初始化,不是赋值。
// 其实这儿就涉及了C++中的两种初始化的方式:复制初始化和赋值初始化。
// 其中c5采用的是复制初始化,而c4采用的是赋值初始化,这两种方式都是要调用拷贝构造函数的。
}

热心网友 时间:2023-10-09 00:52

前面一个类,没有定义构造函数,编译器会自动生成 默认构造函数和拷贝构造函数,这个不用说,强调的是自动生成

后面一个类,自己定义了一个构造函数,编译器就不会自动生成其他构造函数了,所以像前一个那样赋值的时候,发现找不到对应的构造函数而报错追问“所以像前一个那样赋值的时候,发现找不到对应的构造函数而报错 ”,什么意思?麻烦说清楚点!谢谢

追答你声明了的是有参数的构造,所以只有通过这种参数构造的形式进行初始化了,因为其他构造函数(如默认构造函数不自动生成)
而你那样的初始化对象(数组初始化模式),只能调用默认构造函数(无参),所以因为找不到默认构造(没生成),而报错

热心网友 时间:2023-10-09 00:52

上帝说可以用{}初始化聚合对象;
聚合指的是: 数组、没有(构造函数,私有成员,受保护的成员,基类,虚函数)的类、结构体或联合体。
根据以上定义,有构造函数的类不是聚合体,所以不能用{}初始化 。
也就是说你上述说法是不严谨的,即使你木有任何显式的构造函数,如果成员是私有的,你也不能用{}初始化。。。。。。。。。。。。一试就知道是你想要的。。。。。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 exo second box世勋做牙齿矫正了吗 exo second box第四集kai自己拍照片的时候的bgm是什么?大概一分钟过一点的 second box in the year exo second box为什么没有tao,当时拍exodus预告片时tao还在 我眼睛没有近视却喜欢带美瞳,请问带美瞳对眼睛有伤害吗? 写一句民族谚语。!!!??? 傣族清廉谚语 如何给宝宝取名 不近视,戴美瞳隐形眼镜对眼睛有危害吗? fe01滤镜在哪 如何将强大的SVG滤镜用在HTML元素中 D0.601Ct4d0.041ct是什么意思 想要哈尔滨道外区的地图 宾县到长白山天池多少公里自驾游 宾县距离哈尔滨多远? 宾县到哈尔滨三棵树车站地图不走高速 怎么看powershell版本 离线地图导航宾县到北安多少公里 黑龙江省哈尔滨市宾县常安镇的经度和纬度是多少 宾县 在哪里呀?? 中稻国色天香一7中稻种子种植简介? 茄皮紫适合黄皮吗? 国色天香 国画 利群国色天香真假辨别 - 信息提示 PC/AT,EIAS,PCI,AGP中哪个的总线带宽最大? PCI的总线带宽和AGD的总线带宽大多数是多少,目前的总线带宽最大值是多少? 百度钱包那个绑定银行卡输入身份证和手机号,验证码啥的是真的吗???? PCI的最大带宽是多少? 宽带的总线(汇总的主线)的最高带宽能达到几G? 艾弗森 生日 艾弗森出生地 最终幻想ff14飞艇乘坐地点在哪里飞艇好玩吗 最终幻想14 3.0个人飞空艇怎么做 ff14 2.35 制作鸟人族飞空艇有什么用 ff14国服3.0飞空艇探索综合评价怎么提升 综合评价S方法 大理婚纱照工作室比较靠谱的有哪些?唯一旅拍和惜惜旅拍应该选哪个? 我的被封 了,怎么登都登不上,怎么办? 拼多多看数据用哪个软件?听说【多多情报通】的多多数据分析工具选品更全面 拼多多数据软件?听说【多多情报通】的多多数据分析工具选品更全面