C++中构造函数的理解

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。

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

  1. class Time
  2. {
  3. public : //声明为公用成员
  4. hour;
  5. minute;
  6. sec;
  7. };
  8. Time t1={14,56,30}; //将t1初始化为14:56:30

这种情况和结构体变量的初始化是差不多的,在一个花括号内顺序列出各公用数据成员的值,两个值之间用逗号分隔。但是,如果数据成员是私有的,或者类中有private或protected的成员,就不能用这种方法初始化。

这里的几个例子(C++面向对象程序设计举例)是用成员函数来对对象中的数据成员赋初值的(例如例8.3中的set_time函数)。从例8.3中可以看到,用户在主函数中调用set_time函数来为数据成员赋值。如果对一个类定义了多个对象,而且类中的数据成员比较多,那么,程序就显得非常臃肿烦琐。

构造函数的作用

为了解决这个问题,C++提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。

构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。

【例9.1】在例8.3基础上定义构造成员函数。

  1. #include <iostream>
  2. using namespace std;
  3. class Time
  4. {
  5. public :
  6. Time( )
  7. {
  8. hour=0;
  9. minute=0;
  10. sec=0;
  11. }
  12. void set_time( );
  13. void show_time( );
  14. private :
  15. int hour;
  16. int minute;
  17. int sec;
  18. };
  19. void Time::set_time( )
  20. {
  21. cin>>hour;
  22. cin>>minute;
  23. cin>>sec;
  24. }
  25. void Time::show_time( )
  26. {
  27. cout<<hour<<":"<<minute<<":"<<sec<<endl;
  28. }
  29. int main( )
  30. {
  31. Time t1;
  32. t1.set_time( );
  33. t1.show_time( );
  34. Time t2;
  35. t2.show_time( );
  36. return 0;
  37. }

程序运行的情况为:

10 25 54  (从键盘输入新值赋给t1的数据成员)

10:25:54    (输出t1的时、分、秒值)

0:0:0   (输出t2的时、分、秒值)

在类中定义了构造函数Time,它和所在的类同名。在建立对象时自动执行构造函数,它的作用是对该对象中的数据成员赋初值0。请不要误认为是在声明类时直接对程序数据成员陚初值(那是不允许的),赋值语句是写在构造函数函数体中的,只有在调用构造函数时才执行这些赋值语句,对当前的对象中的数据成员赋值。

上面是在类内定义构造函数的,也可以只在类内对构造函数进行声明而在类外定义构造函数。将程序中的第4~7行改为下面一行:

Time( ); //对构造函数进行声明

在类外定义构造函数:

  1. Time::Time( ) //在类外定义构造成员函数,要加上类名Time和域限定符“::”
  2. {
  3. hour=0;
  4. minute=0;
  5. sec=0;
  6. }

有关构造函数的使用,有以下说明:

  1. 在类对象进入其作用域时调用构造函数。
  2. 构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同之点。
  3. 构造函数不需用户调用,也不能被用户调用。
  4. 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
  5. 如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
时间: 2024-08-28 23:55:20

C++中构造函数的理解的相关文章

关于C#中派生类调用基类构造函数的理解

(1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 Java代码   public class MyBaseClass { public MyBaseClass() { } public MyBaseClass(int i) { Console.WriteLine("我是基类带一个参数的构造函数"); } } public class MyDerivedClass : MyBaseClass { pu

深入理解Javascript中构造函数和原型对象的区别

在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor),instanceof运算符的一些特点.如果对prototype和构造函数不熟悉,可以前往Javascript中prototype属性的详解 和 Javascript 中构造函数与new命令的密切关系 仔细的品味品味.先来做一个简单的回顾. 首先,我们知道,构造函数是生成对象的模板,一个构造函数可以

转 关于C#中派生类调用基类构造函数的理解

关于C#中派生类调用基类构造函数的理解 .c#class       本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.  当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数 Ex: public class MyBaseClass    {    } public class MyDerivedClass : MyBaseClass    {        public MyDerivedClass()        {            Con

C++ 类的多态一(virtual关键字--构造函数深刻理解)

//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代码的编译,不会考虑上下文 例如编译到void ProtectA(Point pin) 编译器就会认为pin就是Point类型, 而不会去联系上下文,去分析pin有没有可能是子类对象 virtual关键字会自动检测这个父类对象有没有是子类对象 */ /* virtual关键字的作用 假设父类中存在用virtua

C#中构造函数和析构函数的用法

构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误.本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项.一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性.C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙.但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角.级别高的

Resolve Type中构造函数传值

1 1 class Test 2 { 3 4 private ITeacher _teacher; 5 private IStudent _student; 6 public Test(ITeacher tea, IStudent stu) 7 { 8 _teacher = tea; 9 _student = stu; 10 } 11 } 2 1 class Student:IStudent 2 { 3 4 public Student() 5 { 6 int i = 1; 7 } 8 9 10

BGP中正则表达式的理解

今天不经意和网上一个朋友聊到H3CTE 考试,不过很遗憾的上我考挂了,所以才和他讨论的,当时讨论BGP 的路由属性控制MED 和LOCAL-PECR ,突然帽出来个正则表达式,很郁闷的是,我一直都没怎么在乎这个东西,以前只是看到过,以为不怎么重要,今天他突然和我讲了下重要性,而且当时考H3CTE 就需要用上这个,汗~~~居然都不知道.和他聊完我立即找这相关方面的资料,找到了一点点,郁闷很难看懂啊,都是一些符号不好理解啊.没法呀,得学习^_^ 下面是对BGP 正则表达式的介绍 . 匹配任意单个字符

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集

Javascript中构造函数的返回值问题和new对象的过程

首先明确一点:javascript中构造函数是不需要有返回值的,这一点跟java很类似.可以认为构造函数和普通函数的最大差别就是:构造函数中没有return语句,普通函数可以有return语句:构造函数中会使用this关键字定义成员变量和成员方法,普通的函数不会使用this关键字定义成员变量和方法. function Person(name,sex) { this.name = name; this.sex = sex; // return 1; //return true; //return