`
modabobo
  • 浏览: 502313 次
文章分类
社区版块
存档分类
最新评论

C++类可以不显示声明构造函数,在创建类对象时编译器自动调用默认的构造函数

 
阅读更多

C++也可以和Java一样不显示声明类的构造函数,编译器在创建对象时调用默认的构造函数。但C++的成员变量的初始值是不确定的,尤其是int类型的变量,初始值未知,容易导致不确定的bug,给程序运行带来麻烦。所以在声明类时还是声明默认的构造函数并初始化变量,养成好的编码风格。

下面是声明类时没有显示声明构造函数和显示声明了构造函数的简单实例:

#include "stdafx.h"

#include <string>
#include <iostream>

using namespace std;

// 没有显示声明构造函数,编译器会调用默认的构造函数
class Test1 {
public:
	int i;
	string str;
};

// 显示声明了构造函数
class Test2 {
public:
	Test2();
	Test2(int i, string s);
	int i;
	string str;
};

Test2::Test2():i(0), str("Test2") {
	cout<<"Test2()"<<endl;
}

Test2::Test2(int i, string s):i(i), str(s) {
	cout<<"Test2(int i, string s)"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"----------------调用默认构造函数,成员变量初始值不确定----------------"<<endl;
	Test1 *t = new Test1;
	cout<<"t->i = "<<t->i<<", t->str = ["<<t->str<<"]"<<endl;
	printf("t->i = %d, t->str = [%s]\n", t->i, (const char *)t->str.c_str());

	cout<<endl<<"----------------调用默认构造函数,并为其成员变量设置初始值----------------"<<endl;
	Test1 *t1 = new Test1;
	t1->i = 0;
	t1->str = "Test1";
	cout<<"t1->i = "<<t1->i<<", t1->str = ["<<t1->str<<"]"<<endl;
	printf("t1->i = %d, t1->str = [%s]\n", t1->i, (const char *)t1->str.c_str());

	cout<<endl<<"----------------调用自定义的无参构造函数,在构造函数中进行初始化成员变量----------------"<<endl;
	Test2 *t2 = new Test2;
	cout<<"t2->i = "<<t2->i<<", t2->str = ["<<t2->str<<"]"<<endl;
	printf("t2->i = %d, t2->str = [%s]\n", t2->i, (const char *)t2->str.c_str());

	cout<<endl<<"----------------调用自定义的有参构造函数,在构造函数中进行初始化成员变量----------------"<<endl;
	Test2 *t3 = new Test2(100, "Today is very hot!");
	cout<<"t3->i = "<<t3->i<<", t3->str = ["<<t3->str<<"]"<<endl;
	printf("t3->i = %d, t3->str = [%s]\n", t3->i, (const char *)t3->str.c_str());

	int x;
	cin>>x;

	return 0;
}

在VS2012上运行结果如下:

----------------调用默认构造函数,成员变量初始值不确定----------------
t->i = -842150451, t->str = []
t->i = -842150451, t->str = []

----------------调用默认构造函数,并为其成员变量设置初始值----------------
t1->i = 0, t1->str = [Test1]
t1->i = 0, t1->str = [Test1]

----------------调用自定义的无参构造函数,在构造函数中进行初始化成员变量----------------
Test2()
t2->i = 0, t2->str = [Test2]
t2->i = 0, t2->str = [Test2]

----------------调用自定义的有参构造函数,在构造函数中进行初始化成员变量----------------
Test2(int i, string s)
t3->i = 100, t3->str = [Today is very hot!]
t3->i = 100, t3->str = [Today is very hot!]


分享到:
评论

相关推荐

    详解在C++中显式默认设置的函数和已删除的函数的方法

    在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也...

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...

    C++默认构造函数的问题

     编译器添加的默认构造函数的条件: 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做(这只是一种情况而言,此构造函数是trival  派生类和基类的关系:  我们...

    C++ 虚继承对基类构造函数调用顺序的影响

    继承作为面向对象编程的一种基本特征,其使用频率非常高。而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与...

    构造与析构顺序

    构造与析构在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 初始化对象的...

    在C++中子类继承和调用父类的构造函数方法

     如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。  构造原则如下:  1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。 ...

    C++中何时调用复制构造函数

     复制构造函数既可以自己定义又可以像默认构造函数一样被编译器隐式调用。但大多数时候,特别是类中有指针成员的时候要实现深复制,避免浅复制时,需要自己定义复制构造函数。  那么我们定义的复制构造函数什么...

    C++ 类的构造函数详解及实例

    C++ 类的构造函数 默认构造函数 如果你定义一个类,并且没有给它定义构造函数。编译器会为这个类提供默认的...类对象成员将调用默认的构造函数来初始化; #include using namespace std; class Box { public: int

    新手学习C++入门资料

    上面例子中,第一次调用show()函数时,让编译器自动提供函数原型中指定的所有默认参数,第二次调用提供了第一个参数,而让编译器提供剩下的两个,第三次调用则提供了前面两个参数,编译器只需提供最后一个,最后一...

    C++的构造函数总结

    当一个对象创建的时候,编译器会调用这个对象的构造函数,在这个时候,或许大家会有疑问了:我并没有为对象指定构造函数,那么编译器调用的构造函数由哪里来呢?  有这点疑惑是一个好的开始,那么当我们没有指定...

    c++ 子类构造函数初始化及父类构造初始化的使用

    如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。  构造函数与父类的其它成员(成员变量和成员方法)不同...

    C++构造函数和析构函数的使用与讲解

    构造函数(constructor) 1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同。 b....例如: class Obj ...2.构造函数可以带参数,也可以重载 ...在创建一个对象时,构造函数自动调用(编译器来完成

    编译器角度看C++复制构造函数

    关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...

    完全掌握C++编程中构造函数使用的超级学习教程

    如果未定义任何构造函数,则编译器会生成不采用任何参数的默认构造函数;可以通过将默认构造函数声明为已删除来重写此行为。 构造函数顺序 构造函数按此顺序执行工作: 按声明顺序调用基类和成员构造函数。 如果类...

    C++中拷贝构造函数的总结详解

    百度百科上是这样说的:拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户...

    C++中拷贝构造函数的应用

     当一个类对象以另一个同类实体作为初值时,大部分情况下会调用拷贝构造函数。 一般是这三种具体情况:  显式地以一个类对象作为另一个类对象的初值,形如X xx=x;  当类对象被作为参数交给函数时。  当函数...

    c++基础语法:构造函数与析构函数

    构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构造函数) ;析构函数是隐式调用的,delete对象时候会自动调用完成...

    C++私有构造函数的作用

     当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致...

    C++课程实验三代码大全.zip

    1 、定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取...

Global site tag (gtag.js) - Google Analytics