关于类和对象的进一步讨论 C++
如果一个类中所有成员函数都是公用的,则可以在定义对象时对数据成员进行初始化:
class Time
{
public:
hour;
minute;
sec;
};
Time t1={14,15,23};//将t1初始化为14:15:23
但是数据成员是私有的,或者类中有private或protected的成员,就不能用这种方法初始化。
构造函数:
构造函数是一种特殊的成员函数,用来处理对象的初始化,它不需要用户调用它,而是在建立对象时自动执行。构造函数的名子必须与类名同名,而不能由用户任 意命名,以便编译系统能够识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数和函数参数。
#include <iostream>
using namespace std;
class Time
{
public:
Time()
{
hour=0;
minute=0;
sec=0;
}
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
void Time::set_time()
{
cin>>hour;
cin>>minute;
cin>>sec;
}
void Time::show_time()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
int main()
{
Time t1,t2;
t1.set_time();
t1.show_time();
t2.set_time();
t2.show_time();
return 0;
}
在Time中定义了构造函数Time,它和所在的类同名,在建立对象时自动执行构造函数,它的作用是对该对象中的各数据成员赋初值0。记住,不要认为在声明时直接对程序数据成员赋初值。,这是错的,赋值语句只能写在构造函数体中,只有在调用构造函数时才执行这些赋值语句,对当前的对象中的数据成员赋值。
上面是在类内定义构造函数,也可以只在类内对构造函数进行声明而在类外定义构造函数。如
Time();
在类外定义构造函数:
Time::Time()
{
hour=0;
minute=0;
sec=0;
}
有关构造函数的说明:
1.什么时候开始使用构造函数?在类对象进入其作用域时开始调用构造函数。
2.构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同点。
3.构造函数不需要用户调用,也不需要被用户调用。构造函数在建立对象时由系统自动执行的,而且只执行一次。构造函数一般声明为public。
4.在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句,例如cout语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保 持程序的清晰。
5.如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也咩有参数,不执行初始化的操作。
带参数的构造函数。
由于有时用户需要对不同的对象赋予不同的初值,这时就就无法使用不含参数的构造函数实现了。
可以使用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化,构造函数的一般格式:
构造函数名(类型1 形参1,类型2 形参2,类型3 形参3,....)
用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参(如fun(a,b)),实参是在定义对象时给出的,定义对象的一般格式为:
类名 对象名(实参名1,实参名2,....)
记住:带形参的构造函数主要目的就是为了使用不同的参数来得到不同的结果。实现对不同的对象进行不同的初始化。
使用参数初始化表对数据成员初始化
参数初始化表来实现对数据成员的初始化,这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例如:
Box::Box(int h,int w,int len):height(h),width(w),length(len){}
即在原来函数首部的末尾加一个冒号,然后列出参数的初始化表。上面的初始化表表示:用形参h的值初始化数据成员height,用形参w初始化数据成员 width,用形参len的值初始化数据成员length。甚至可以直接在类体中定义函数。
构造函数的重载。
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相 同。这称为构造函数的重载。
说明:
1.调用构造函数时不必给出实参的构造函数,称为默认构造函数,有些书中翻译为缺省构造函数。显然,无参数的构造函数属于默认的构造函数。一个类 中只可以有一个默认的构造函数。
2.如果在建立对象时选用的是无参数构造函数,应该注意正确书写定义对象的语句。
3.尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中的一个构造函数,并非每个构造函数都被执行。
使用默认的构造函数。
构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参去默认值。
#include <iostream>
using namespace std;
class Box
{
public:
Box(int h=10,int w=10,int len=15);
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 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.应该在什么地方指定构造函数的默认参数?应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。因为类的声明时放在头文件中的,用户是可以看到的,而函数的定义是类的实现细节,用户是看不到的。
2.如果构造函数的全部参数都指定了默认值,则在定义对象时可以给出一个或几个实参,也可以不给出实参。
3.在一个类中定义了全部是默认参数的构造函数后,不能在定义重载构造函数。
关于类和对象的进一步讨论 C++的更多相关文章
- 关于类和对象的进一步讨论之析构函数 C++
析构函数也是一个特殊的成员函数.它的作用与构造函数相反.它的名字是在类名的前面加一个“~”符号.在C++中“~”是位取反运算符.当对象的生命结束时,会自动执行解析函数.以下几种情况会执行析构函数: 1 ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...
- 一文讲全了Python 类和对象内容
摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan . Pytho ...
- Objective-C Runtime 运行时之一:类与对象
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- iOS RunTime运行时(1):类与对象
Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...
- 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)
译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...
- js之数组,对象,类数组对象
许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...
随机推荐
- Android Fragment与Activity交互的几种方式
这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...
- 指定DIV局部刷新的简单实现,很简单,但是网上搜到的大部分都很复杂
脚本部分: <script type="text/javascript"> $(function () { setInterval(function () { $(&q ...
- Overview of Polymorphism -多态的分类
多态有类型系统衍生. 有限类型.无限类型.确定类型. Classifications Christopher Strachey (1967) introduced the concept of pol ...
- vue使用插槽分发内容slot的用法
将父组件的内容放到子组件指定的位置叫做内容分发 //在父组件里使用子组件 <son-tmp> <div>我是文字,我需要放到son-tmp组件里面制定的位置</div&g ...
- AdminLTE框架基础布局使用
boxbox-solid:去掉顶部边框线box-headerwith-border:添加头底部边框线 按钮:—— btn btn-default 默认<div class="btn-g ...
- 爬虫系列(十二) selenium的基本使用
一.selenium 简介 随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载 对于爬取这些网站,一般有两种思路: 分析 Ajax 请 ...
- phpstorm zhuce ma
username :cf96PiPYt271u1TC License Key : 97807-12042010 00001GctOKh8f206hliugiW6iAS5bh 8AAXfEtfpdDSr ...
- Java基础之 HelloWorld
1. Java发展史 参考: https://www.cnblogs.com/guoqingyan/p/5667064.html 2. Java中 JDK, JRE, JVM之间的关系 参考: htt ...
- Pycharm中Git、Github的简单使用和配置
Pycharm中Git.Github的使用 PyCharm本身自带了git,稍微配置一下就可以很好的在图形界面下进行Python项目的版本控制 配置Git 在配置前先新建一个项目,当然也可以打开已有的 ...
- hashlib模块 简单了解
import hashlib '''不可逆加密''' password = 'wwwwww7777'.encode('utf8') word = hashlib.md5(password) # md5 ...