如果一个类中所有成员函数都是公用的,则可以在定义对象时对数据成员进行初始化:

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++的更多相关文章

  1. 关于类和对象的进一步讨论之析构函数 C++

    析构函数也是一个特殊的成员函数.它的作用与构造函数相反.它的名字是在类名的前面加一个“~”符号.在C++中“~”是位取反运算符.当对象的生命结束时,会自动执行解析函数.以下几种情况会执行析构函数: 1 ...

  2. oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

    一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...

  3. 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

    4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...

  4. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  5. Objective-C Runtime 运行时之一:类与对象

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  6. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  7. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  8. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  9. js之数组,对象,类数组对象

    许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...

随机推荐

  1. 前端-Vue结构思维导图笔记

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记有vue结构分析,JS基础,JQ,JS高级,Angular,git等等

  2. 联想VIBE Shot(Z90-7/全网通) 解锁BootLoader

    工具下载链接: http://pan.baidu.com/s/1dF7zGTb 备用下载链接: http://pan.baidu.com/s/1i4UHP4L 本篇教程教你如何傻瓜式解锁BootLoa ...

  3. windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案(转)

    戴尔服务器r530 windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案 关于在服务 ...

  4. 国外AI界牛人主页 及资源链接

    感觉 好博客要收集,还是贴在自己空间里难忘!!! 原文链接:http://blog.csdn.net/hitwengqi/article/details/7907366 http://people.c ...

  5. 08--MOOC--C/C++ 根据年月日计算星期几

    计算任何一天是星期几的几种算法 一:常用公式 W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也 ...

  6. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  7. 简单servlet调用dao层完整步骤

    导入包lib(文件名称) 目录结构:web下:views.web-inf.index.jsp views下各种jsp文件和js(里面放封装好的jquery包) js下:jquery包(js文件后缀) ...

  8. 【第二课】kaggle案例分析二

    Evernote Export 推荐系统比赛(常见比赛) 推荐系统分类 最能变现的机器学习应用 基于应用领域分类:电子商务推荐,社交好友推荐,搜索引擎推荐,信息内容推荐等 **基于设计思想:**基于协 ...

  9. 【转】上拉下拉电阻、I/O输出(开漏、推挽等)

    作者:BakerZhang 链接:https://www.jianshu.com/p/3ac3a29b0f58来源:简书 感谢! ——————————————————————————————————— ...

  10. eas之指定虚模式

    KDTable支持三种取数模式:实模式.虚模式分页.虚模式分组,默认为实模式.// 实模式table.getDataRequestManager().setDataRequestMode(KDTDat ...