【C++】利用构造函数对类对象进行初始化
运行环境:VS2017
一、对象的初始化
每一个对象都应当在它建立之时就有就有确定的内容,否则就会失去对象的意义。
class Time
{int hour = 0;int min = 0;int sec = 0;
};
这种是错误的,类并不是一个实体,并不占储存空间,显然无处容纳数据。
如果一个类是公用的,可以在定义对象时对数据成员进行初始化。
class Time
{
public:int hour;int min;int sec;
};
Time t1 = { 13,23,45 };
二、用构造函数实现对数据成员的初始化
C++提供构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其它成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
构造函数的名字必须与类名同名,以便编译系统能识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。
#include <iostream>
using namespace std;
class Array
{
public:Array(){n = 100;for (int i = 0; i <= 99; i++){a[i] = i+10;}}void set_value();void show_value();
private:int a[100];int n;
};
void Array::set_value()
{cin >> n;for (int i = 0; i < n; i++){cin >> a[i];}
}
void Array::show_value()
{for (int i = 0; i < n; i++){cout << a[i] << " ";}cout << endl;
}
int main()
{Array arr;arr.set_value();arr.show_value();Array ar1;ar1.show_value();return 0;
}
下面的10-109是构造函数对对象的初始化。
上面是在类内定义构造函数的,也可以只在类内对构造函数进行声明而在类外定义构造函数。
Array_sort::Array_sort()
{n = 100;for (int i = 0; i <= 99; i++){a[i] = i + 10;}
}
注意:
1、构造函数没有返回值,因此也没有类型。
2、构造函数不需要用户调用,也不能被用户调用。
3、可以用一个类对象初始化另一个类对象。
Time t1;
Time t2=t1;
4、如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
三、带参数的构造函数
可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。
构造函数首部的一般形式为:
构造函数名(类型1 形参1,类型2 形参2 ,......)
实参是在定义对象时给出的。
类名 对象名(实参1,实参2,......)
#include<iostream>
using namespace std;
class box
{
public :box(int, int, int);int volume();
private:int height;int width;int length;
};
box::box(int h, int w, int l)
{height = h;width = w;length = l;
}
int box::volume()
{return (height*width*length);
}
int main()
{box box1(12, 25, 30);cout << "The volume of box1 is " << box1.volume()<<endl;box box2(15, 30, 21);cout << "The volume of box2 is " << box2.volume() << endl;return 0;
}
四、使用参数初始化表对参数进行初始化
这种方法不再函数体内对数据成员初始化,而是在函数首部实现。
带有参数初始化表的构造函数的一般形式如下:
类名::构造函数名([参数表])[:成员初始化表]
{
[构造函数体]
}
方括号内为可选项(可有可无)。如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值。
box::box(int h, int w, int l) :height(h), width(w), length(l) {}
或者是在类里面:
class box
{
public :box(int h, int w, int l) :height(h), width(w), length(l) {}int volume();
private:int height;int width;int length;
};
#include<iostream>
using namespace std;
class box
{
public :box(int , int , int );int volume();
private:int height;int width;int length;
};
box::box(int h, int w, int l) :height(h), width(w), length(l) {}
int box::volume()
{return (height*width*length);
}
int main()
{box box1(12, 25, 30);cout << "The volume of box1 is " << box1.volume()<<endl;box box2(15, 30, 21);cout << "The volume of box2 is " << box2.volume() << endl;return 0;
}
五、构造函数的重载
在一个类中可以定义多个构造函数,以便为对象提供不同的初始化方法。这些构造函数有相同的名字,但是参数的个数和类型不同。这成为构造函数的重载。
在建立对象时不必给出实参的构造函数,成为默认构造函数。显然,无参构造函数属于默认构造函数。
改变在:6-7行,14-19行
#include<iostream>
using namespace std;
class box
{
public :box();box(int h, int w, int l) :height(h), width(w), length(l) {}int volume();
private:int height;int width;int length;
};
box::box()
{height = 10;width = 10;length = 10;
}
int box::volume()
{return (height*width*length);
}
int main()
{box box1;cout << "The volume of box1 is " << box1.volume()<<endl;box box2(15, 30, 21);cout << "The volume of box2 is " << box2.volume() << endl;return 0;
}
六、使用默认参数的构造函数
构造函数中的参数的值既可以通过实参传递,也可以指定为默认的值,即如果用户不指定实参值,编译系统就使用形参去默认值。
#include<iostream>
using namespace std;
class box
{
public :box(int h=10, int w=10, int l=10);int volume();
private:int height;int width;int length;
};
box::box(int h,int w,int l)
{height = h;width = w;length = l;
}
int box::volume()
{return (height*width*length);
}
int main()
{box box1;cout << "The volume of box1 is " << box1.volume()<<endl;box box2(15);cout << "The volume of box2 is " << box2.volume() << endl;box box3(15,30);cout << "The volume of box3 is " << box3.volume() << endl;box box4(15,30,20);cout << "The volume of box4 is " << box4.volume() << endl;return 0;
}
说明:
1、在第6行的声明构造函数时,形参名可以省略
box(int =10, int =10, int =10);
2、一个类只能有一个默认构造函数,也就是说,可以不用参数而调用构造函数,一个类只能有一个。
box();
box(int =10, int =10, int =10);
//“box::box”: 对重载函数的调用不明确
3、在一个类中定义了全部是默认参数的构造函数,不能再定义重载的构造函数。
相关文章:

自定义Chrome浏览器
一、全局 自用备份,窗体透明化、要添加对应网站的窗体class到对应的位置 /*主页背景*/ /*https://images.cnblogs.com/cnblogs_com/AardWolf/1350846/o_5900399dcdcbd.jpg*/ /*https://ws4.sinaimg.cn/large/0072Vf1pgy1foxkfzphb2j31hc0u0gvv.jpg*/body { backgrou…

ubuntu添加sudo权限
使用如下命令可以添加到用户组(也可是超级用户组)。 命令如下: sudo usermod -aG 超级用户组名 用户名 例子:sudo usermod -aG sudo username 其中a:表示添加,G:指定组名第二种方法是直接修改,…

File.separator
报告“No such file or diretory ”的异常,上传不了。后来发现是文件路径的问题。模拟测试环境是windowstomcat,而正式的的环境是linuxtomcat,文件路径的分隔符在windows系统和linux系统中是不一样。 比如说要在temp目录下建立一个test.txt文…
【C++】对象数组
运行环境:VS2017 对象数组:每个元素都是同类的对象 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。 Student stud[3]{60,70,80}; 如果构造函数有多个参数,则不能用在定义数组时直接提供所有实…

C# 算法系列一基本数据结构
一、简介 作为一个程序员,算法是一个永远都绕不过去的话题,虽然在大学里参加过ACM的比赛,没记错的话,浙江赛区倒数第二,后来不知怎么的,就不在Care他了,但是现在后悔了,非常的后悔!!!如果当时好好学算法的话,现在去理解一些高深的框架可能会很easy,现在随着C#基础和Web技能的提…

git管理大项目或者大文件
git 是追踪代码库演进的最佳选择,并且它能让你与你的同事间高效协作。当你想要追踪的库非常巨大时会发生什么?在这篇文章里,我会尝试着给你一些想法和技巧来恰当地处理不同种类的大仓库。两种大代码库如果仔细想想,大概会有两种导…

window下java开发环境安装
首先请去Java的官网上下载,最好下载最新版本地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 如图,点击下载java platform(JDK),然后选择接受接受协议(Accept …
【ACM】蛇形填数
先判断,再移动,而不是发现越界了再退回来。 #include "stdio.h" #include "string.h" #define maxn 20 int a[maxn][maxn]; int main() {int n, x, y, tot 0;scanf_s("%d", &n);memset(a, 0, sizeof(a));tot a[x …

Mybatis中Oracle和Mysql的Count字段问题
Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询。那么在Mybatis通常情况下我们是这么写的 <select id"testCount" resultType"int">select…

为什么free()时不需要传指针大小
malloc()和free()是c中两个非常基本的函数,但这种最基本的东西往往都是特别复杂的。malloc和free的原形如下:void *malloc(unsigned int num_bytes); void free(void *ptr);在c的标准中并没有定义这两个函数的具体实现,在我们最常用的gcc中&a…

redis cluster 安装配置
一、redis集群安装配置1、下载redis源码包并下载wget http://download.redis.io/releases/redis-3.0.7.tar.gz $ tar xzf redis-3.0.7.tar.gz $ cd redis-3.0.7 yum -y install gcc gcc-c libstdc-devel #解决相关依赖关系$ make && make install 因我们安装redis 集…

【ACM】汉诺塔
https://blog.csdn.net/xueerfei008/article/details/9904681

什么是机器人底盘 答案在这里!
机器人底盘承载了机器人本身的定位、导航及避障等基本功能,可帮助机器人实现智能行走,以思岚科技的ZEUS为例,内置SLAMWARE高性能自主定位导航模块,用户可根据实际需要搭载不同的应用,可广泛适用于餐厅、商场、银行、办…

嵌入式linux内存使用和性能优化
这本书有两个关切点:系统内存(用户层)和性能优化。 这本书和Brendan Gregg的《Systems Performance》相比,无论是技术层次还是更高的理论都有较大差距。但是这不影响,快速花点时间简单过一遍。 然后在对《Systems Performance》进行详细的学…

【算法导论】插入排序
循环不变式 在数学上阐述了通过循环(迭代,递归)去计算一个累计的目标值的正确性。 关于循环不变式,我们必须要证明三条性质: 初始化:循环第一次迭代之前,它为真。保持:如果循环的…

gdb+gdbserver
内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程…

Android开发技巧——去掉TextView中autolink的下划线
我们知道,在布局文件中设置textview的autolink及其类型,这时textivew上会显示link的颜色,并且文字下面会有一条下划线,表示可以点击。而在我们在点击textview时,应用将根据我们所设置的类型跳转到对应的界面。但是有时…

【算法导论】冒泡排序 选择排序
冒泡排序: //从大到小 void bubble_sort(int array[],int len) {int i,j,t;for(i0;i<len-1;i){for(j0;j<len-1-i;j){if(array[j]<array[j1]){tarray[j];array[j]array[j1];array[j1]t;} }} } 选择排序: //从大到小 void select_sort(int a…

监控平台zabbix高级配置
2019独角兽企业重金招聘Python工程师标准>>> 12月26日任务 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理 添加自定义监控项目 zabbix可以自定义监控项目,满足个性化的需求。例如网站注册量、访问量等具体…

linux内存实际占用分析
作者: 黄永兵/译 出处:51CTO.com 阅读提示:本文是为那些经常疑惑的人准备的,“为什么一个简单的KDE文本编辑器要占用25M内存?”导致大多数人认为许多Linux应用程序,特别是KDE或GNOME程序都象ps报告一样臃肿...【51CTO.com独家译文…

CentOS 6.5 下Vim 配置图解
分享个CentOS 6.5 下Vim 配置图文详解,希望对大家有所帮助。 1. 登录并进入你常用的用户名下,查看其主目录 命令: # su xxx $ cd xxx $ ls -a 2.查看并建立目录和文件 首先看你的主目录~/ 下是否有.vimrc文件,没有就输入指令 $ to…
【ACM】杭电OJ 1106 函数atoi
函数atoi是把字符串转化成整数的函数,头文件为 #include "stdlib.h" e.g. 运行环境:Dev-C 5.11 杭电1106 调用了sort函数,运行的时间相对长一些。 #include "stdio.h" #include "string.h" #include "…

docker-dockerfile
docker文件存储驱动dockerfile镜像构建指令示例dockekr镜像是只读的,对容器修改的内容,一旦容器退出,所有的内容将会丢失。镜像是分层的,最上的一层为读写层(写时复制和用时分配) 文件系统存储驱动…

proc/[pid]/maps 文件解释
proc/[pid]/maps 文件解释 查看进程的虚拟地址空间是如何使用的。 该文件有6列,分别为: 地址:库在进程里地址范围 权限:虚拟内存的权限,r读,w写,x,s共享,p私有; 偏移量:库在进程里…

【ACM】UVa 1339
【题目】:给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一一映射,使得两个字符串相同。输入两个字符串,输出“YES”或者“NO”。 【分析】:既然字母可…

springBoot PUT请求接收不了参数的解决办法
2019独角兽企业重金招聘Python工程师标准>>> 做项目的时候,想把接口写标准点,于是在更新内容的时候采用put提交内容,但是提交内容时总是获取不到参数,总是选择参数为null。 首先贴出我的put的方法控制器的代码 和之前的…

七牛云内容审核服务被选为「上海首批人工智能创新产品」
近日,上海人工智能应用场景建设实施计划正式发布,这是全国首次面向人工智能应用场景需求的征集计划。上海 10 大人工智能应用场景、19 个具体点位需求和 60 个人工智能创新产品集中首发,其中,上海七牛信息技术有限公司(…

linux动态库命名规则
说道“动态库版本兼容”,很多人头脑中首先蹦出的就是“Dll Hell”。啊,这曾经让人头疼的难题。时至今日,这个难题已经很好地解决了。 在进一步讨论之前来思考一个问题:Linux下为什么没有让人头痛的“DllHell”? 回答…

如何在同一系统里同时启动多个Tomcat
需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序,需要占用几个通讯端口,所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件,通过在配置文件设置不同的通讯端口就可以做到.文件 %TOMCAT_HOME%/conf…