C++浅析构造函数的特性

目录
  • 构造函数的概念
  • 构造函数的特性
  • 只能有一个构造函数

构造函数的概念

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。

构造函数的特性

(1)函数名与类名相同。

(2)无返回值。

(3)编译器自动调用对应的构造函数。

(4)构造函数可以重载。

我们这里直接举一个例子

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.InitData(2022,5,21);
	d1.PrintfData();
	return 0;
}

于是得到的的结果为:

只能有一个构造函数

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

下面举一个错误案例:

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
Data()
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1
	return 0;
}

上面的代码中,有两个默认的构造函数,因为不带参数的构造函数和全缺省的构造函数都被看为默认的构造函数,所以说,现在有两个构造函数,编译器不知道到底要去调用哪个构造函数,所以说,就会报错,所以我们删除一个就可以了。

关于编译器生成的默认成员函数,很多人会有疑惑:在我们不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?对象调用了编译器生成的默认构造函数,但是对象year/month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用?

解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如int/char...,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就发发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year;
	int _month;
	int _day;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

什么意思呢,就是编译器会不管int,char这种基本类型,而会去管自定义类型

这是输出的结果

到此这篇关于C++浅析构造函数的特性的文章就介绍到这了,更多相关C++构造函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++类继承时的构造函数

    前言: 子类需要编写自己的构造函数和析构函数,需要注意的是,子类只负责对新增的成员进行初始化和扫尾编写构造和析构函数,父类成员的初始化和扫尾工作由父类的构造函数和析构函数完成. 无论何种类型的继承方式,子类都无权访问父类的所有成员,所以子类对父类的初始化需要父类的构造函数完成.此时,子类的构造函数必须提供父类构造函数所需的参数. 子类构造函数的语法如下: 子类::子类(全部参数表):父类1(父类1参数表),父类2(父类2参数表)      ...对象成员1(对象成员1参数表),对象成员2(对象成

  • C++构造函数的类型,浅拷贝与深拷贝详解

    目录 一.无参构造函数 二.含参构造函数 三.拷贝构造函数 四.深拷贝和浅拷贝 总结 一.无参构造函数 1.如果没有定义构造函数,则系统自动调用此默认构造函数,且什么都不做. 2.如果用户自定义了带参数的构造函数,若还想调用无参的构造函数,必须显示定义 person() { cout << "this object is being created." << endl; } 二.含参构造函数 一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参

  • C++超详细讲解构造函数与析构函数的用法及实现

    目录 写在前面 构造函数和析构函数 语法 作用 代码实现 两大分类方式 三种调用方式 括号法 显示法 隐式转换法 正确调用拷贝构造函数 正常调用 值传递的方式给函数参数传值 值传递方式返回局部对象 构造函数的调用规则 总结 写在前面 上一节解决了类与对象封装的问题,这一节就是对象的初始化和清理的构造函数与析构函数的内容了:对象的初始化和清理也是两个非常重要的安全问题:一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题:c++利用了构

  • c++详细讲解构造函数的拷贝流程

    #include <iostream> #include <string> using namespace std; void func(string str){ cout<<str<<endl; } int main(){ string s1 = "http:www.biancheng.net"; string s2(s1); string s3 = s1; string s4 = s1 + " " + s2; fu

  • C++分析构造函数与析造函数的特点梳理

    目录 构造函数的调用 构造函数的分类及调用 拷贝构造的调用时机 深拷贝与浅拷贝 构造函数的调用 默认情况下编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体实现)--完成对象的初始化 2.默认析构函数(无参,函数体为空)--完成对象的清理 3.默认拷贝构造函数,属性进行值拷贝 规则: 如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造 如果用户定义了拷贝构造函数,c++不会在提供其他函数 类名(){} 构造函数的语法 1,没有返回值,也不写void: 2,函数名称与

  • C++类与对象深入之构造函数与析构函数详解

    目录 对象的初始化和清理 一:构造函数 1.1:构造函数的特性 1.2:构造函数的分类 二:析构函数 2.1:概念 2.2:特性 三:拷贝构造函数 3.1:概念 3.2:特性 3.3:拷贝构造函数调用时机 3.4:构造函数调用规则 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全.C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置. 一:构造函数 对象的初始化和清理也是两个非常重要的安全问题,一个

  • C++探索构造函数私有化会产生什么结果

    目录 对于单个类 私有化与继承 成员变量与私有化 提问:假设只有一个构造方法,如果将之私有化会有什么后果 对于当前类,它是无法实例化的 对于它的子类,子类也是无法实例化的 构造函数与是否能够实例化有关 对于单个类 正常情况下 #include <iostream> using namespace std; class EventDispatcher { public: void test_printf(){ std::cout << "test_printf --\r\n

  • C++超详细讲解构造函数

    目录 类的6个默认成员函数 构造函数 特性 编译器生成的默认构造函数 成员变量的命名风格 类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函数了吗?并不是的,在我们定义类时即使我们没有写任何成员函数,编译器会自动生成下面6个默认成员函数. class S { public: int _a; }; 这里就来详细介绍一下构造函数. 构造函数 使用C语言,我们用结构体创建一个变量时,变量的内容都是随机值,要想要能正确的操作变量中存储的数据,我们还需

  • C++超详细讲解拷贝构造函数

    目录 构造函数 特征 编译器生成的拷贝构造 拷贝构造的初始化列表 显式定义拷贝构造的误区 结论 构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用 拷贝构造函数是构造函数的一个重载,因此显式的定义了拷贝构造,那么编译器也不再默认生成构造函数. 特征 拷贝构造也是一个特殊的成员函数 特征如下: 拷贝构造是构造函数的一个重载: 拷贝构造的参数只有一个并且类型必须是该类的引用,而不是使用传值调用,否则会无限递归: 若没有显

  • C++浅析构造函数的特性

    目录 构造函数的概念 构造函数的特性 只能有一个构造函数 构造函数的概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次. 构造函数的特性 (1)函数名与类名相同. (2)无返回值. (3)编译器自动调用对应的构造函数. (4)构造函数可以重载. 我们这里直接举一个例子 #include<iostream> using namespace std; class Data { public:

  • c++ 入门——浅析构造函数和析构函数

    前文回顾 本文档环境基于Vscode + GCC + CodeRunner 关于C++的环境搭建请参考下面链接: https://www.jb51.net/article/186542.htm 由于本人具有C#开发经验,部分相同的知识就不再赘述了.只列一下需要记录的知识. HelloWorld cout 代表输出<< cin 代表输入 >> endl;代表换行,清空缓冲区. #include <iostream> int main() { std::cout <&

  • 深入浅析JDK8新特性之Lambda表达式

    第一次是接触Lambda表达式是在TypeScript中(JavaScript的超集中),当时是为了让TypeScript的this方法外而不是本方法内所使用的.使用过后突然想到Lambda不是JDK8的重量级新特性么?于是感觉查阅相关资料并记录下来: 一. 行为参数化 行为参数化简单的说就是函数的主体仅包含模板类通用代码,而一些会随着业务场景而变化的逻辑则以参数的形式传递到函数之中,采用行为参数化可以让程序更加的通用,以应对频繁变更的需求. 考虑一个业务场景,假设我们需要通过程序对苹果进行筛选

  • 浅析Spring4新特性概述

    Spring 4.1目前已经发布RC1版本,而GA版本预计在14年9月中旬发布:其中有部分内容直接借鉴自Spring Boot,而Spring Boot从目前趋势来看已经是Spring的顶级项目:另外也提供了页面自动化测试框架Spring MVC Test HtmlUnit,和Spring MVC Test一样先是独立项目,如果发展态势很好,会最终合并到Spring Framework中. 从目前来看Spring 4.1并没有特别吸引眼球的地方,主要还是增强和一些依赖的版本升级.主要改进如下:

  • 浅析Java8新特性Lambda表达式和函数式接口

    什么是Lambda表达式,java8为什么使用Lambda表达式? "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.我们可以把 Lambda表达式理解为是 一段可以传递的代码.最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性. // 启动一个线程,不使用Lambda

  • ASP.NET私有构造函数用法分析

    本文实例分析了ASP.NET私有构造函数用法.分享给大家供大家参考.具体分析如下: 一.私有构造函数的特性   1.一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员. 2.私有构造函数是一种特殊的实例构造函数.它通常用在只包含静态成员的类中.如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例. 3.私有构造函数的特性也可以用于管理对象的创建.虽然私有构造函数不允许外部方法实例化这个类,

  • 关于C++复制构造函数的实现讲解

    复制构造函数是一种特殊的构造函数,有一般构造函数的特性.它的功能是用一个已知的对象来初始化一个被创建的同类对象.复制构造函数的参数传递方式必须按引用来进行传递,请看实例: #include <iostream> #include <cstring> using namespace std ; class Student { private : char name[8]; int age ; char sex ; int score ; public : void disp(); /

  • 学习YUI.Ext 第四天--对话框Dialog的使用

    使用方法: 1.加入YUI.Ext 库到你的web程序: <!-- YAHOO UI Utilities Lib, you will need to replace this with the path to your YUI lib file --> <script type="text/javascript" src="deepcms/yui/utilities_2.1.0.js"></script><script ty

  • 浅谈Javascript中的函数、this以及原型

    关于函数 在Javascript中函数实际上就是一个对象,具有引用类型的特征,所以你可以将函数直接传递给变量,这个变量将表示指向函数"对象"的指针,例如: function test(message){ alert(message); } var f = test; f('hello world'); 你也可以直接将函数申明赋值给变量: var f = function(message){ alert(message); }; f('hello world'); 在这种情况下,函数申明

随机推荐