【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全部拆解,就可以使用通过 ...
随机推荐
- ubuntu安装jdk eclipse mysql等
linux ubuntu下安装java web开发环境,需要安装包: jdk7 eclipse(选择java EE developer) apche-tomcat mysql(workbench可视化 ...
- WinDbg调试.NET
WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...
- jQuery整理笔记5----jQuery大事
一.大事 1.载入中DOM $(document).ready() 这个第一节里具体介绍了 2.事件绑定 jQuery定义了bind()方法作为统一的接口.用来为每个匹配元素绑定事件处理程序.其基本的 ...
- IP地址和子网掩码
A分类IP住址 在第一个领域值规模:0-127 默认子网掩码:255.0.0.0 B分类IP就拿地址的第一个字段值范围:128-191 默认的子网掩码255.255.0.0 C类IP地址的第一个字 ...
- Dp_F Pku1157
<span style="color:#000099;">/* F - 简单dp Time Limit:1000MS Memory Limit:10000KB 64bi ...
- JavaScript之函数作用域
有过类似C语言编程经验的同学应该都知道“块级作用域(block scope)”:花括号内的每一段代码都具有各自的作用域,而且在声明它们的代码段之外是不可见的.而在JavaScript中是没有块级作用域 ...
- Microservice架构模
Microservice架构模 在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices& ...
- javascript 的Date 格式化, 模仿shell中date命令的格式
原文:javascript 的Date 格式化, 模仿shell中date命令的格式 shell 中显示当前的日期 [root@localhost]$ date '+%Y-%m-%d %H:%M:%S ...
- XSS学习笔记(五)-XSS防御
如果只生产XSS的地方都与输入或输出相关联的.所以错过了主要矛盾.而且,我们将有一个解决问题的办法:您可以输入端砚格过滤,是可能的过滤输出时间,输出到用户的GET或POST中是否有敏感字符: 输入过滤 ...
- AspNet.WebAPI.OData.ODataPQ
AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务 AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔) AspNet. ...