我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++面向对象中构造函数使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++面向对象中构造函数使用详解

构造函数作用

构造函数可以在创建对象的时候初始化成员数据,或者利用现有对象修改现有对象数据(赋值拷贝构造函数)。

构造函数特征

自动调用,在创建对象的时候编译器自动调用 - 构造函数名和类名相同 - 构造函数没有返回值 - 可以有多个构造函数(类似函数重载)

构造函数种类

  • 默认构造函数
  • 自定义构造函数
  • 拷贝构造函数
  • 赋值构造函数

默认构造函数

编译器合成的默认构造函数

没有手动创建默认构造函数的时候,编译器会去自动合成构造函数

  • 合成默认构造函数使用类内初始化数据去初始化数据
  • 如果没有类内初始化数据,那么合成构造函数内就是空的什么都不做

默认构造函数

程序:

Student.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	void describion();
private:
	// 类内初始化
	// 创建对象的时候如果没有构造函数那边编译器会自己合成默认构造函数并且用这些数据来初始化对象
	// 编译器和合成的默认构造函数和手动定义的默认构造函数区别是:
	//    编译器合成的只会拿这些类内初始化数据去初始化对象
	//    手动定义的默认构造函数如果有初始化数据的时候也可以用其他数据去覆盖初始化数据,也就是说数据初始化的值以构造函数内为准
	int age = 12;
	char name[20] = "bian";
	string sex = "男";
};

Student.cpp

#include "Student.h"
void Student::describion() {
	cout << this->name << " " << this->sex << " " << this->age << endl;
}

main.cpp

#include "Student.h"
using namespace std;
int main() {
	Student s1;  // 创建对象调用默认构造函数
	s1.describion();
	system("pause");
	return 0;
}

结果:

bian 男 12

请按任意键继续. . .

手动定义的默认构造函数

手动定义的默认构造函数特点:Student::Student()

手动定义的默认构造函数和编译器和成的默认构造函数没太大区别。

唯一的区别:手动默认构造函数可以使用类内初始化的值,也可以不使用类内初始化的值。

程序:

Student.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student();
	void describion();
private:
	// 类内初始化
	int age = 12;
	char name[20] = "bian";
	string sex = "男";
};

Student.cpp

#include "Student.h"
// 自定义默认构造函数
Student::Student() {
	// 使用类内初始化数据来初始化
	// 其实这种就是编译器合成默认构造函数
	this->age = age;
	strcpy_s(this->name, 20, "bian");
	this->sex = sex;  
	
}
void Student::describion() {
	cout << this->name << " " << this->sex << " " << this->age << endl;
}

main.cpp

#include "Student.h"
using namespace std;
int main() {
	Student s1;  // 创建对象调用默认构造函数
	s1.describion();
	system("pause");
	return 0;
}

结果:

bian 男 12

请按任意键继续. . .

自定义带参数的构造函数

自定义带参数的构造函数特点:Student::Student(int age, const char name)*

带参数,可以重载。

代码:

Student.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student();  // 默认构造函数
	Student(int age, const char* name);  // 自定义带参构造函数
	Student(int age, const char* name, string sex);  // 自定义带参构造重载函数
	void describion();
private:
	// 类内初始化
	int age = 12;
	char name[20] = "bian";
	string sex = "男";
};

Student.cpp

#include "Student.h"
// 自定义默认构造函数
Student::Student() {
	// 使用类内初始化数据来初始化
	// 其实这种就是编译器合成默认构造函数
	cout << __FUNCTION__ << endl;
	cout << "自定义默认构造函数" << endl;
	this->age = age;
	strcpy_s(this->name, 20, "bian");
	this->sex = "未知";
}
// 自定义带参构造函数
Student::Student(int age, const char* name) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造函数" << endl;
	this->age = age;
	strcpy_s(this->name, 20, name);
}
// 自定义带参构造重载函数
Student::Student(int age, const char* name, string sex) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造重载函数" << endl;
	this->age = age;
	strcpy_s(this->name, 20, name);
	this->sex = sex;
}
void Student::describion() {
	cout << this->name << " " << this->sex << " " << this->age << endl;
	cout << endl;
}

main.cpp

#include "Student.h"
using namespace std;
int main() {
	Student s1;  // 调用自定义默认构造函数
	s1.describion();
	Student s2(13, "wang");  // 调用自定义带参构造函数
	s2.describion();
	Student s3(14, "gao", "女");  // 调用自定义带参构造函数(重载)
	s3.describion();
	system("pause");
	return 0;
}

结果:

Student::Student
自定义默认构造函数
bian 未知 12

Student::Student
自定义带参构造函数
wang 男 13

Student::Student
自定义带参构造重载函数
gao 女 14

请按任意键继续. . .

为什么会出现 wang 男 13,可以思考下这个男。答案在标题下方。

拷贝构造函数

拷贝构造函数特点:Student::Student(const Student& other)

深浅拷贝是针对在堆区开辟内存的数据,深拷贝重新开辟内存存数据,浅拷贝直接把原来的堆区拿过来用

合成拷贝构造函数

合成拷贝构造函数是编译器自动合成的属于浅拷贝

自定义拷贝构造函数

自定义拷贝构造函数可以实现深拷贝

Student.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student();  // 默认构造函数
	Student(int age, const char* name);  // 自定义带参构造函数
	Student(int age, const char* name, string sex);  // 自定义带参构造重载函数
	Student(const Student& other);  // 拷贝构造函数
	void describion();
private:
	// 类内初始化
	int age = 12;
	char* name;
	string sex = "男";
};

Student.cpp

#include "Student.h"
// 自定义默认构造函数
Student::Student() {
	// 使用类内初始化数据来初始化
	// 其实这种就是编译器合成默认构造函数
	cout << __FUNCTION__ << endl;
	cout << "自定义默认构造函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, "bian");
	this->sex = "未知";
}
// 自定义带参构造函数
Student::Student(int age, const char* name) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, name);
}
// 自定义带参构造重载函数
Student::Student(int age, const char* name, string sex) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造重载函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, name);
	this->sex = sex;
}
// 拷贝构造函数
Student::Student(const Student& other) {
	cout << __FUNCTION__ << endl;
	cout << "拷贝构造函数" << endl;
	// 浅拷贝,堆区地址还是以前的,其实编译器合成的拷贝构造函数就是这个
	this->age = other.age;
	this->name = other.name;
	this->sex = other.sex;
	// 深拷贝部分主要是堆区空间重新开辟
	this->age = other.age;
	// 重新开辟堆区
	this->name = new char[20];
	strcpy_s(this->name, 20, other.name);
	this->sex = other.sex;
}
void Student::describion() {
	cout << this->name << " " << this->sex << " " << this->age << endl;
	cout << endl;
}

main.cpp

#include "Student.h"
using namespace std;
// 拷贝构造函数调用第二种时机函数形参是值传递而不是引用
void test1(Student other) {
	cout << __FUNCTION__ << endl;
	cout << endl;
}
// 拷贝构造函数调用第三种时机返回值是值传递
Student test2(const Student& other) {
	cout << __FUNCTION__ << endl;
	cout << endl;
	return other;
}
int main() {
	Student s1;  // 调用自定义默认构造函数
	s1.describion();
	Student s2(13, "wang");  // 调用自定义带参构造函数
	s2.describion();
	Student s3(14, "gao", "女");  // 调用自定义带参构造函数(重载)
	s3.describion();
	// 拷贝构造函数:调用时机1、利用已有对象创建新对象
	Student s4 = s2;
	s4.describion();
	Student s5(s3);
	s5.describion();
	// 拷贝构造函数:调用时机2、函数参数的值传递
	test1(s5);
	// 拷贝构造函数:调用时机3、函数返回值的值传递
	test2(s5);
	cout << endl;
	// 拷贝构造函数:代用时机4、数组值时对象
	Student s6[2] = { s1, s2 };
	system("pause");
	return 0;
}

结果:

Student::Student
自定义默认构造函数
bian 未知 12

Student::Student
自定义带参构造函数
wang 男 13

Student::Student
自定义带参构造重载函数
gao 女 14

Student::Student
拷贝构造函数
wang 男 13

Student::Student
拷贝构造函数
gao 女 14

Student::Student
拷贝构造函数
test1

test2

Student::Student
拷贝构造函数

Student::Student
拷贝构造函数
Student::Student
拷贝构造函数
请按任意键继续. . .

结果解析:

拷贝构造函数的调用时间

程序演示已经在自定义拷贝构造函数中写了。

  • 使用已有对象创建新对象
  • 函数参数是对象值传递
  • 函数返回值是对象值传递
  • 数组成员是对象

赋值构造函数(operator=)

赋值构造函数特点:Student& operator=(const Student& other)

利用已有对象修改已有对象(f2 = f1;)

重载=运算符

程序:

Student.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student();  // 默认构造函数
	Student(int age, const char* name);  // 自定义带参构造函数
	Student(int age, const char* name, string sex);  // 自定义带参构造重载函数
	Student(const Student& other);  // 拷贝构造函数
	Student& operator=(const Student& other);  // 赋值拷贝构造函数
	void describion();
private:
	// 类内初始化
	int age = 12;
	char* name;
	string sex = "男";
};

Student.cpp

#include "Student.h"
// 自定义默认构造函数
Student::Student() {
	// 使用类内初始化数据来初始化
	// 其实这种就是编译器合成默认构造函数
	cout << __FUNCTION__ << endl;
	cout << "自定义默认构造函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, "bian");
	this->sex = "未知";
}
// 自定义带参构造函数
Student::Student(int age, const char* name) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, name);
}
// 自定义带参构造重载函数
Student::Student(int age, const char* name, string sex) {
	cout << __FUNCTION__ << endl;
	cout << "自定义带参构造重载函数" << endl;
	this->age = age;
	this->name = new char[20];
	strcpy_s(this->name, 20, name);
	this->sex = sex;
}
// 拷贝构造函数
Student::Student(const Student& other) {
	cout << __FUNCTION__ << endl;
	cout << "拷贝构造函数" << endl;
	// 浅拷贝,堆区地址还是以前的
	//this->age = other.age;
	//this->name = other.name;
	//this->sex = other.sex;
	// 深拷贝部分主要是堆区空间重新开辟
	this->age = other.age;
	// 重新开辟堆区
	this->name = new char[20];
	strcpy_s(this->name, 20, other.name);
	this->sex = other.sex;
}
// 赋值拷贝构造函数
Student& Student::operator=(const Student& other) {
	cout << __FUNCTION__ << endl;
	cout << "赋值拷贝构造函数" << endl;
	if (this == &other) {
		return *this;  // 防止出现f1=f1
	}
	// 浅拷贝,堆区地址还是以前的
	//this->age = other.age;
	//this->name = other.name;
	//this->sex = other.sex;
	// 深拷贝部分主要是堆区空间重新开辟
	this->age = other.age;
	// 重新开辟堆区
	this->name = new char[20];
	strcpy_s(this->name, 20, other.name);
	this->sex = other.sex;
	return *this;
}
void Student::describion() {
	cout << this->name << " " << this->sex << " " << this->age << endl;
	cout << endl;
}

main.cpp

#include "Student.h"
using namespace std;
int main() {
	Student s1(14, "gao", "女");  // 调用自定义带参构造函数(重载)
	s1.describion();
	// 调用赋值拷贝构造函数
	Student s2;
	s2.describion();
	s2 = s1; 
	s2.describion();
	system("pause");
	return 0;
}

结果:

Student::Student
自定义带参构造重载函数
gao 女 14

Student::Student
自定义默认构造函数
bian 未知 12

Student::operator =
赋值拷贝构造函数
gao 女 14

请按任意键继续. . .

特别注意

1、当存在类内初始值的时候,除了赋值拷贝构造函数外,其他的构造函数(默认构造函数、自定义参数构造函数、拷贝构造函数)在执行构造函数前都会先执行下数据初始值。

2、初始化列表只存在构造函数中(成员数据、父类对象可以使用初始化列表初始化)

到此这篇关于C++面向对象中构造函数使用详解的文章就介绍到这了,更多相关C++构造函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++面向对象中构造函数使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++面向对象中构造函数使用详解

学习过C语言的小伙伴知道:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,这篇文章主要介绍了C++面向对象中构造函数使用
2022-11-13

C++面向对象中构造函数如何使用

这篇“C++面向对象中构造函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++面向对象中构造函数如何使用”文章吧
2023-07-04

C++中如何使用类对象构造函数

C++中如何使用类对象构造函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于普通类型的对象来说,他们之间的复制是很简单的,自己定义的类的对象同样是对象,谁也
2023-06-17

C++类与对象及构造函数析构函数基础详解

这篇文章主要为大家介绍了C++类与对象及构造函数析构函数基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

C++中类对象的拷贝构造函数

本篇内容主要讲解“C++中类对象的拷贝构造函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中类对象的拷贝构造函数”吧!拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一
2023-06-17

C++类、对象、构造函数及析构函数怎么定义使用

这篇文章主要介绍“C++类、对象、构造函数及析构函数怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++类、对象、构造函数及析构函数怎么定义使用”文章能帮助大家解决问题。C++类与对象C
2023-07-06

C++ 友元函数详解:友元函数在面向对象设计中的应用?

c++++ 友元函数是一种特殊函数,可访问另一个类的私有和受保护成员。通过声明友元函数,非成员函数可以与特定类交互。友元函数的应用包括操作符重载、i/o 操作和底层实现。例如,友元函数可被用来重载 + 运算符,支持自定义数据类型之间的运算,
C++ 友元函数详解:友元函数在面向对象设计中的应用?
2024-04-29

面向对象编程中 C++ 内联函数的应用

内联函数是在 oop 中提高方法调用效率的有用工具,因为它们在编译时展开,避免了函数调用的开销。声明内联函数时,在函数定义前添加 inline 关键字即可。内联函数的优点包括提高性能、减小代码大小和提高可读性。但在使用时,需注意潜在的代码膨
面向对象编程中 C++ 内联函数的应用
2024-04-16

ES6解构赋值(数组,对象,函数)使用详解

这篇文章主要介绍了ES6解构赋值(数组,对象,函数)使用详解,JavaScript中最常用的两种数据结构是Object和Array,解构操作对那些具有很多参数和默认值等的函数也很奏效,本文通过实例代码详细讲解需要的朋友可以参考下
2022-11-16

C#中构造函数如何使用

C#中构造函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#构造函数在使用方面及行为方面的一些特殊规则:1、如果开发人员没有为一个类提供构造函数,那
2023-06-17

C#中怎么使用构造函数

本篇文章给大家分享的是有关C#中怎么使用构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录