关于类和对象的进一步讨论 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之数组,对象,类数组对象
许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...
随机推荐
- web前端利用HTML代码显示符号
HTML常用符号代码: ´ ´ © © > > µ µ ® ® & & ° ° ¡ ¡ » » ¦ ¦ ÷ ÷ ¿ ¿ ...
- Inception搭建
Inception安装Inception是集审核.执行.回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和My ...
- python监听鼠标和键盘
import PyHook3 def OnMouseEvent(event): print('MessageName:',event.MessageName) print('Message:',eve ...
- 【sqli-labs】 less24 POST- Second Order Injections *Real treat* -Stored Injections (POST型二阶注入 *真的好玩?* 存储注入)
简单登陆浏览一遍后,发现是一个登陆注册修改密码的应用 审查一下代码 登陆页面的username,password使用了转义 注册页面的参数也进行了转义处理 但是在修改password的页面,直接从se ...
- layui confirm
layer.confirm('是否要删除信息!', { btn: ['确定', '取消'] }, function (index, layero) { //移除元素 $("#tr" ...
- 原生js封装ajax,深入理解$.ajax()
直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...
- 【hihocoder 1296】数论三·约瑟夫问题
[题目链接]:http://hihocoder.com/problemset/problem/1296 [题意] [题解] [Number Of WA] 0 [完整代码] #include <b ...
- MySQL用Load Data local infile 导入部分数据后中文乱码
今天在两台MySQL服务器之间导数据,因为另一个MySQL服务器是测试用的,差一个月的数据,从现有MySQL服务器select到一个文件,具体语句是: select * from news where ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- ubuntu中安装hadoop集群
hadoop是由java 语言编写的主从结构分布式计算存储架构 准备工作: 操作系统: Ubuntu16.04 软件安装包:jdk-8u171-linux-x64.tar.gz : hadoop-2. ...