广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++面向对象中构造函数使用详解
  • 261
分享到

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

C++构造函数的作用C++构造函数的写法 2022-11-13 18:11:00 261人浏览 薄情痞子
摘要

目录构造函数作用构造函数特征构造函数种类默认构造函数编译器合成的默认构造函数手动定义的默认构造函数自定义带参数的构造函数拷贝构造函数合成拷贝构造函数自定义拷贝构造函数拷贝构造函数的调

构造函数作用

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

构造函数特征

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

构造函数种类

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

默认构造函数

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

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

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

默认构造函数

程序:

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++构造函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++面向对象中构造函数使用详解

本文链接: https://www.lsjlt.com/news/170197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++面向对象中构造函数使用详解
    目录构造函数作用构造函数特征构造函数种类默认构造函数编译器合成的默认构造函数手动定义的默认构造函数自定义带参数的构造函数拷贝构造函数合成拷贝构造函数自定义拷贝构造函数拷贝构造函数的调...
    99+
    2022-11-13
    C++构造函数的作用 C++构造函数的写法
  • C++面向对象中构造函数如何使用
    这篇“C++面向对象中构造函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++面向对象中构造函数如何使用”文章吧...
    99+
    2023-07-04
  • C++类与对象及构造函数析构函数基础详解
    目录C++类与对象类的定义对象的创建构造函数和析构函数访问修饰符继承多态成员变量与成员方法总结C++类与对象 C++是一门面向对象的编程语言。在C++中,我们可以利用类来创建对象,...
    99+
    2023-05-16
    C++类对象函数 c++ 构造析构函数
  • C++中如何使用类对象构造函数
    C++中如何使用类对象构造函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于普通类型的对象来说,他们之间的复制是很简单的,自己定义的类的对象同样是对象,谁也...
    99+
    2023-06-17
  • C++类与对象深入之构造函数与析构函数详解
    目录对象的初始化和清理一:构造函数1.1:构造函数的特性1.2:构造函数的分类二:析构函数2.1:概念2.2:特性三:拷贝构造函数3.1:概念3.2:特性3.3:拷贝构造函数调用时机...
    99+
    2022-11-13
  • C++中构造函数详解
    构造函数按参数为为:有参构造函数和无参构造函数 按类型分为:普通构造函数和拷贝构造函数 构造函数的三种调用方法:括号法,显示法,隐式转换法; //括号法 Person p1; ...
    99+
    2022-11-13
  • C++面向对象编程之析构详解
    目录1. 概述2. 详论2.1. 对象生命周期2.2. 不一定需要显式析构2.3. 析构的必要性3. 总结1. 概述 类的析构函数执行与构造函数相反的操作,当对象结束其生命周期,程序...
    99+
    2022-11-13
  • C++中的构造函数详解
    目录普通变量的初始化构造函数一定会生成默认构造函数吗?防止隐式类型转换赋值与初始化的区别对象的计数成员初始化的顺序类的引用成员构造函数使用注意事项参考总结普通变量的初始化 当我们在定...
    99+
    2022-11-12
  • C++中类对象的拷贝构造函数
    本篇内容主要讲解“C++中类对象的拷贝构造函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中类对象的拷贝构造函数”吧!拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一...
    99+
    2023-06-17
  • C++类、对象、构造函数及析构函数怎么定义使用
    这篇文章主要介绍“C++类、对象、构造函数及析构函数怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++类、对象、构造函数及析构函数怎么定义使用”文章能帮助大家解决问题。C++类与对象C...
    99+
    2023-07-06
  • Python学习之面向函数转面向对象详解
    还记得前文函数章节的‘函数的定义与使用’章节么?今天我们就来针对 类 进行一个综合练习,利用所学的面向对象编程、类 的知识将我们之前做的面向函数编写的学生信息...
    99+
    2022-11-13
  • C++中的复制构造函数详解
    目录复制构造函数复制构造函数的三种调用复制构造函数的禁用深拷贝与浅拷贝一定会生成默认复制构造函数吗?参考 总结普通变量的复制 有时我们会在定义一个变量的同时使用另一个变量来初始化它。...
    99+
    2022-11-12
  • C++中的拷贝构造函数详解
    目录C++拷贝构造函数(复制构造函数)详解1) 为什么必须是当前类的引用呢?2) 为什么是 const 引用呢?默认拷贝构造函数总结C++拷贝构造函数(复制构造函数)详解 拷贝和复制...
    99+
    2022-11-13
  • C++编程析构函数拷贝构造函数使用示例详解
    目录构造函数析构函数拷贝构造之深拷贝和浅拷贝深浅拷贝区别首先定义一个类进行操作。 class MM { public: protected: int year; ...
    99+
    2022-11-12
  • python基础之函数和面向对象详解
    目录函数函数参数变量作用域内嵌函数和闭包lambda 表达式面向对象三大特性类、类对象 和 实例对象类属性 和 对象属性私有魔法方法基本的魔法方法算术运算符属性访问 描述符...
    99+
    2022-11-13
  • C++中拷贝构造函数的总结详解
    1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这...
    99+
    2022-11-15
    拷贝构造函数 C++
  • C++中构造函数与析构函数的详解及其作用介绍
    目录构造函数默认构造函数有参构造函数析构函数析构函数例子析构函数执行时机局部对象全局对象构造函数 构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对...
    99+
    2022-11-12
  • C++构造析构赋值运算函数应用详解
    目录了解C++默默编写哪些函数不想使用编译器函数为多态基类声明virtual析构函数别让异常逃离析构函数绝不在构造和析构过程中调用virtual函数令operator=返回一个ref...
    99+
    2022-11-13
  • C#中怎么使用构造函数
    本篇文章给大家分享的是有关C#中怎么使用构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简...
    99+
    2023-06-17
  • C#中构造函数如何使用
    C#中构造函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#构造函数在使用方面及行为方面的一些特殊规则:如果开发人员没有为一个类提供构造函数,那么,...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作