当前位置: 首页 > news >正文

构造函数

一、构造函数

构造函数用来在创建对象时初始化对象,为对象数据成员赋初始值。

类的数据成员是不能在类定义时初始化的,类定义并没有产生一个实体,而是给出了一个数据类型,不占用存储空间,无处容纳数据。

如果一个类所有的数据成员是公有的(public),则可以在定义对象时对数据成员进行初始化。

C++提供了构造函数(constructor)来处理对象的初始化问题。构造函数是类的一种特殊成员函数,不需要人为调用,而是在建立对象时自动被执行。

C++规定构造函数的名字与类的名字相同,并且不能指定返回类型。

#include <iostream>using namespace std;class Cuboid{
public:Cuboid(int l, int h, int d);int volume(){return length * height * depth;}
private:int length, height, depth;
};Cuboid::Cuboid(int l, int h, int d)
{length = l;height = h;depth = d;
}int main()
{Cuboid a(1, 2, 3);cout << "volume = " << a.volume() << endl;Cuboid b(10, 20, 30);cout << "volume = " << b.volume() << endl;return 0;
}

(1)构造函数是在创建对象时自动执行的,而且只执行一次,并先于其他成员函数执行。构造函数不需要人为调用,也不能被人为调用。

(2)构造函数一般声明为公有的(public),因为创建对象通常是在类的外部进行的。

(3)一般不提倡在构造函数中加入与初始化无关的内容。

(4)每个构造函数应该为每个数据成员提供初始化。

与普通函数一样,构造函数具有函数名、形参列表和函数体。与其他函数不同的是,构造函数可以包含一个构造函数初始化列表:

#include <iostream>
using namespace std;
class Cuboid{public:Cuboid(int l, int h, int d);int volume(){return length * height * depth;}private:int length, height, depth;
};Cuboid::Cuboid(int l, int h, int d) : length(l), height(h), depth(d)
{cout << length << " " << height << " " << depth << endl;
}int main()
{Cuboid a(1, 2, 3);cout << a.volume() << endl;return 0; 
} 

二、构造函数的重载

#include <iostream>
using namespace std;
class Point{public:Point(){x = 0;y = 0;}Point(int a, int b): x(a), y(b){}void display(){cout << x << " " << y << endl;}private:int x, y;
};int main()
{Point m;m.display();Point n(5, 20);n.display();return 0;
}

尽管一个类中可以包含多个构造函数,但对于每一个对象来说,建立对象时只执行其中一个,并非每个构造函数都被执行。

三、带默认参数的构造函数

#include <iostream>
using namespace std;
class Point{public:Point(int a=0, int b=0) : x(a), y(b){ }void display(){cout << x << " " << y << endl; }private:int x, y; 
};int main()
{Point k, m(1), n(1, 2);k.display();m.display();n.display();return 0;
}

(1)必须在类的内部指定构造函数的默认参数,不能在类外部指定默认参数。

 

 (2)如果构造参数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。

(3)在一个类中定义了带默认参数的构造函数后,不能再定义与之有冲突的重载构造函数。

一般地,不应同时使用构造函数的重载和带默认参数的构造函数。

http://www.lryc.cn/news/118917.html

相关文章:

  • JS 原型与继承
  • 解决 Oracle 数据库中表被锁问题的方案和方法
  • ORACLE行转列、列转行实现方式及案例
  • AI自动驾驶
  • 思维导图在职业规划中的应用:从职业选择到职业发展的思维导图
  • antv l7每次刷新无法加载iconFont
  • 28 玻尔兹曼机
  • 命令提示符之操作基础(Windows)
  • 【C语言】初识C语言+进阶篇导读
  • wxWidgets学习笔记:wxListCtrl使用详解
  • 酷炫的python日志库-loguru
  • html根据图片变换背景色
  • “深入探究JVM:揭秘Java虚拟机的工作原理“
  • 小程序的api使用 以及一些weui组件实列获取头像 扫码等
  • 海思ss928部署手写数字识别模型
  • 组学知识速递(五)|ChIP-seq知多少?
  • 2308C++内存序概略
  • 【C++】string的使用
  • Android 周期任务
  • 修改第三方组件默认样式
  • 【游戏客户端】制作你玩我猜Like玩法
  • 分页查询从接口到实现,统一对日期类型进行格式化处理
  • 栈和队列详解(1)
  • 苏州OV泛域名RSA加密算法https
  • 凯迪正大—微机继电保护校验仪
  • Linux文件属性与权限管理(可读、可写、可执行)
  • Centos7.9安装lrzsz进行文件传输---Linux工作笔记059
  • 酒吧座位全解析 小白必看
  • DAY19
  • Data analysis|Tableau基本介绍及可实现功能