【c++类的构造函数具体解释 】
一、构造函数是干什么的
class Dog
{
public:
// 类Dog的构造函数
// 特点:以类名作为函数名,无返回类型
Dog()
{
weight = 0;
}
private:
// 数据成员
int weight;
}
该类对象被创建时,编译系统对象分配内存空间,并自己主动调用该构造函数->由构造函数完毕成员的初始化工作
int main()
{
Dogdd;
}
编译系统为对象dd的每一个数据成员(weight)分配内存空间,并调用构造函数Dog( )自己主动地初始化对象dd的weight值设置为0
故:
构造函数的作用:初始化对象的数据成员。
二、 构造函数的种类
class Dog
{
private :
double height;
double width;
public:
// 无參数构造函数
// 假设创建一个类你没有写不论什么构造函数,则系统会自己主动生成默认的无參构造函数,函数为空,什么都不做
// 仅仅要你写了一个以下的某一种构造函数,系统就不会再自己主动生成这样一个默认的构造函数,假设希望有一个这种无參构造函数,则须要自己显示地写出来
Dog(void)
{
height= 0.0;
width=0.0;
}
// 一般构造函数(也称重载构造函数)
// 一般构造函数能够有各种參数形式,一个类能够有多个一般构造函数,前提是參数的个数或者类型不同(基于c++的重载函数原理)
// 比如:你还能够写一个 Dog( int num)的构造函数出来
// 创建对象时依据传入的參数不同调用不同的构造函数
Dog(double a, double b)
{
height= a;
width = b;
}
// 复制构造函数(也称为拷贝构造函数)
// 复制构造函数參数为类对象本身的引用,用于依据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
// 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,详细原因请查询 有关 “浅拷贝” 、“深拷贝”的文章论述
Dog(const Dog & c)
{
//将对象c中的数据成员值复制过来
height = c.heightl;
width = c.width;
}
// 类型转换构造函数,依据一个指定的类型的对象创建一个本类的对象
// 比如:以下将依据一个double类型的对象创建了一个Dog对象
Dog::Dog(double r)
{
height = r;
width = 0.0;
}
// 等号运算符重载
// 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建
// 若没有显示的写=运算符重载,则系统也会创建一个默认的=运算符重载,仅仅做一些主要的拷贝工作
Dog &operator=( const Dog&rhs )
{
//首先检測等号右边的是否就是左边的对象本,若是本对象本身,则直接返回
if ( this ==&rhs )
{
return *this;
}
//复制等号右边的成员到左边的对象中
this->height= rhs.height;
this->width= rhs.width;
//把等号左边的对象再次传出
//目的是为了支持连等 eg: a=b=c 系统首先执行 b=c
//然后执行 a= ( b=c的返回值,这里应该是复制c值后的b对象)
return *this;
}
};
以下使用上面定义的类对象来说明各个构造函数的使用方法:
void main()
{
// 调用了无參构造函数,数据成员初值被赋为0.0
Dog c1,c2;
// 调用一般构造函数,数据成员初值被赋为指定值
Dog c3(1.0,2.5);
// 也能够使用以下的形式
Dog c3 = Dog(1.0,2.5);
// 把c3的数据成员的值赋值给c1
// 因为c1已经事先被创建,故此处不会调用不论什么构造函数
// 仅仅会调用 = 号运算符重载函数
c1 = c3;
// 调用类型转换构造函数
// 系统首先调用类型转换构造函数,将5.2创建为一个本类的暂时对象,然后调用等号运算符重载,将该暂时对象赋值给c1
c2 = 5.2;
// 调用拷贝构造函数( 有以下两种调用方式)
Dog c5(c2);
Dog c4 = c2; // 注意和 = 运算符重载区分,这里等号左边的对象不是事先已经创建,故须要调用拷贝构造函数,參数为c2
}
【c++类的构造函数具体解释 】的更多相关文章
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...
- [改善Java代码]使用匿名类的构造函数
建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...
- c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]
说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- scala入门教程:scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- tuple解包给类的构造函数
首先我们的第一步当然是将tuple解包.tuple提供了一个get函数来获取第N个元素.例如: get<1>(make_tuple(...)); 要将一个tuple全部拆解,就可以使用通过 ...
随机推荐
- oracle触发农产品证明文件号码
CREATE OR REPLACE TRIGGER TRG_KC_SPRK_i BEFORE INSERT ON KC_SPRK FOR EACH ROW DECLARE vS ...
- JAVA网络编程-----TCP沟通
java采纳TCP变速箱使用Socket和ServerSocket数据传输. 采纳tcp步模式数据传输: 1.设定client和服务器 ,分别对应Socket和ServerSocket 2.建立连接后 ...
- Debian 7设备nginx周围环境、编译并安装和启动
/********************************************************************* * Author : Samson * Date ...
- cocos2d 消除类游戏简单的算法 (一)
1. 游戏视频演示 2.三消游戏我的理解 上面视频中的游戏.我做了2个星期时间,仅仅能算个简单Demo,还有bug.特效也差点儿没有.感觉三消游戏主要靠磨.越磨越精品. 市场上三消游戏已经超级多了.主 ...
- Ubuntu14.04 工作区设置
记ubuntu您可以切换工作区,但我按住 Ctrl+Alt+方向键 交换器,有没有反应,在这样的使用切换啊. 原来Ubuntu14.04默认并没有开启,仅仅须要设置一下就OK了. 1.打开系统设置.外 ...
- linux的自动化操作相关使用方法汇总(转)
linux系统的web网站在运营状态时,我们常需要对网站进行维护,例如查看资源剩余并做出响应.日志分割.数据整理,在特定状态执行特定任务等等,这些都会需要linux能实现自动执行某些任任务.本篇博文介 ...
- HDU 1086:You can Solve a Geometry Problem too
pid=1086">You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Mem ...
- Objective-C基调(4)Category
OC它提供了一种不同的方式--Category,可以动态地添加新的行为已经存在的类(方法),这确保了较小的类的原始设计,然后逐渐加入扩展. 正在使用Category扩张的上课时间,你并不需要创建一个子 ...
- UVA315- Network(无向图割点)
题目链接 题意: 给出一张无向图,求割点的个数 思路:非常裸的题目.直接套用模版就可以. 代码: #include <iostream> #include <cstdio> # ...
- iphone手机版降级
想减少移动版本号.你能下载下来你想要的版本在苹果开发者网站,或"信誉"或可以下载到其他网站的iPhone下载固件固件网站.然后打开iTunes,进入 然后按着(alt).同一时候用 ...