C++之类和对象的使用(一)
对象的初始化
在声明类时直接对数据成员初始化是错误的!下面的例子时错误的!!
class Time{
hour =;
minitu=;
sec=;
} //因为类并不是一个实体,而是一种抽象类型,并不占存储空间,显然无处容纳数据;
如果一个类中的所有成员都是public类型,则可以在定义对象的时候对数据成员初始化。
class Time{
public:
hour;
minitu;
sec;
};
Time t1={,,};//类似于结构体初始化成员,但仅限于public数据成员
用构造函数实现数据成员的初始化
C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行;构造函数的名字必须与类名相同,不具有任何类型,不具有返回值;
1)在类内定义构造函数
class Time{
public:
Time(){
hour =;
minitu=;
sec=;
}
}
Time t1={,,};
2)在类内声明,在类外定义
class Time{
public:
Time();//声明构造函数
}
Time::time()
{
hour=;
minute=;
sec=;
}
构造函数的使用,有以下说明:
1)什么时候调用构造函数?在建立对象的时候会自动调用构造函数。在建立对象时为该对象分配存储单元,此时执行构造函数,就把指定的初值送到有关数据成员的存储单元。每建立一个对象,就调用一次构造函数。
2)构造函数没有返回值,也没有类型,作用只是对对象进行初始化。
3)构造函数不需要用户调用,也不被用户调用。
t1.Time();//错误
4)可以用一个类对象初始化另一个对象。
Time t1; //建立对象t1,同时调用构造函数t1.Time()
Time t2=t1;//建立对象t2,并调用一个t1初始化t2
此时,把对象t1的各数据成员的值复制到t2相应的各成员,而不调用构造函数t2.Time();
5)在构造函数的函数体中不仅可以对数据成员赋初值,也可以包含其他语句,如cout语句,但是一般不提倡。
6)如果用户没有定义,则系统会自动生成一个构造函数,只是这个构造函数的函数体时空的,也没有参数,不执行初始化操作;
带参数的构造函数
有时用户希望对不同的对象赋予不同的初值,这就需要考虑带参数的构造函数了。在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。构造函数首部的一般形式为:
构造函数名(形参1,形参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 len) //类外定义 构造函数
{
height=h;
width=w;
length=len;
} int Box::volume()
{
return(height*width*length);
} int mian()
{
Box box1(,,);//建立对象box1,给出实参
cout<<"the box2 is:"<<box2.volume()<<endl;
return ;
}
1)带参数的构造函数中的形参,其对应的实参是建立对象时给定的。即建立对象的同时指定数据成员的初值。
2)定义不同对象时用的实参是不同的,它们反应不同对象的属性。用这种方法可以方便地实现对不同的对象进行不同的初始化。
用参数初始化表对数据成员初始化
定义构造函数可以用如下形式:
类名::构造函数名([参数表])[:成员初始化表]{ [构造函数体]}//方括号内为可选项(可有可无)
Box::Box(int h,int w,int len):height(h),width(w),length(len){}
构造函数的重载
在一个类中可以定义多个构造函数,以便为对象提供不同的初始化的方法。这些构造函数有相同的名字,而参数的个数或参数的类型不同,称为构造函数的重载。
#include<iostream>
using namespace std; class Box
{public:
Box();
Box(int h,int w,int len):height(h),width(w),length(len){}
int volume();
private:
int height;
int width;
int length;
};
Box::Box()
{
height=;
width =;
length=;
} int Box::volume(){
return(height*width*length);
} int main()
{
Box box1;//建立对象box1,不指定实参
cout<<"the box1 is:"<<box1.volume()<<endl;
Box box2(,,);
cout<<"the box2 is:"<<box2.volume()<<endl;
return ;
}
///////////////////////////
Box::Box(int h)
Box::Box(int h,int w)
1)在建立对象时不必给出实参的构造函数,称为默认构造函数。显然,无参构造函数属于默认构造函数;一个类只能有一个默认构造函数。
2)在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。构造函数是不能被用户显式调用的。
3)尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数。
使用默认参数的构造函数
构造函数中参数的值既可以通过实参传递,也可以指定位某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。
#include<iostream>
using namespace std; class Box
{public:
Box(int h=,int w=,int len=);
int volume();
private:
int height;
int width;
int length;
};
Box::Box(int h,int w,int len)
{
height=h;
width=w;
length=len;
} int Box::volume(){
return(height*width*length);
} int mian()
{
Box box1;
cout<<"the box1 is:"<<box1.volume()<<endl;
Box box2(,);
cout<<"the box2 is:"<<box2.volume()<<endl;
Box box3(,,);
cout<<"the box3 is:"<<box3.volume()<<endl;
return ;
}
说明:
1)应该在什么地方指定构造函数的默认参数?应在声明构造函数时指定默认值,而不是只能在定义构造函数时指定默认值。因为声明是放在头文件中,它是类的对外接口。
2)第五行等价于
Box(int=10,int=10,int=10);//省去形参名
3)如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。可以不用参数而调用的构造函数,一个类只能有一个。下面是错误的!!
Box();//声明一个无参的构造函数
Box(int=,int=,int=);//声明一个全部参数都指定了默认值的构造函数
4)在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
Box(int=,int=,int=);
Box();
Box(int,int);
若有以下定义语句:
Box box1;//是调用上面第一个还是第二个构造函数??
Box box2(,);//是调用上面第一个还是第三个构造函数??
若有以下情况:
Box();
Box(int=,int=,int =);
Box(int,int);
若有以下定义语句:
Box box1;//正确,调用第一个
Box box2();//正确,调用第二个
Box box3(,);//错误,出现歧义
C++之类和对象的使用(一)的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- ASP.NET内置对象的总结
1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0 2. Requ ...
- ADO.NET对象的详解
1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
随机推荐
- 基于OpenGL编写一个简易的2D渲染框架-04 绘制图片
阅读文章前需要了解的知识,纹理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 过程简述:利用 FreeI ...
- UI5-文档-4.3-Controls
现在是时候构建我们的第一个小UI了,将HTML主体中的“Hello World”文本替换为SAPUI5控件sap.m.Text.首先,我们将使用JavaScript控件接口来设置UI,然后将控件实例放 ...
- Maven的配置以及IDEA导入本地Maven
1.首先看你的电脑jdk的环境变量是否配成功 2.Maven的下载地址:http://maven.apache.org/download.cgi 3.下载完成后解压到你要安装的目录,我的是直接放在D: ...
- ActiveMQ安全设置:设置admin的用户名和密码
ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到 <bean id="securityConstraint" class="o ...
- hadoop 链接 mysql
数据在hadoop服务器上,需要导入mysql 可以直接在hadoop上操作 要知道 mysql的 账号 密码 host 步骤: 进入shell 输入: mysql -u 'name' -p'pas ...
- avg(xxxxxx)什么时候能独自出现?
avg(xxxxxx)是作为求一组数据的平均数,需要有这组数据的总数和个数,所以通常配合着group by来使用, 比如: SELECT ID, AVG(GRADE) AS 平均数 FROM TEST ...
- [leetcode]381. Insert Delete GetRandom O(1) - Duplicates allowed常数时间插入删除取随机值
Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...
- centos7下创建mysql5.6多实例
一.mysql安装目录说明mysql5.6以二进制安装包安装在/data/mysql56下数据目录为/data/mysql56/data下配置文件为/etc/my.cnf下 二.多实例目录说明/mys ...
- Linux ld命令
一.简介 http://blog.sina.com.cn/s/blog_a0dc7dcf01014c5s.html 二.选项 http://blog.sina.com.cn/s/blog_a0dc7d ...
- 构建openssl debug版
一.简介 作为一种安全协议,openssl囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 参考: http://www.linuxidc ...