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

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

2023-07-04 11:07:42 178人浏览 泡泡鱼
摘要

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

这篇“c++面向对象中构造函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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
    拷贝构造函数
    请按任意键继续. . .

    结果解析:

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

    拷贝构造函数的调用时间

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

    • 使用已有对象创建新对象

    • 函数参数是对象值传递

    • 函数返回值是对象值传递

    • 数组成员是对象

    赋值构造函数(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

    请按任意键继续. . .

    特别注意

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

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

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

    以上就是关于“C++面向对象中构造函数如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网其他教程频道。

    --结束END--

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

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

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

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

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

    下载Word文档
    猜你喜欢
    • C++面向对象中构造函数如何使用
      这篇“C++面向对象中构造函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++面向对象中构造函数如何使用”文章吧...
      99+
      2023-07-04
    • C++面向对象中构造函数使用详解
      目录构造函数作用构造函数特征构造函数种类默认构造函数编译器合成的默认构造函数手动定义的默认构造函数自定义带参数的构造函数拷贝构造函数合成拷贝构造函数自定义拷贝构造函数拷贝构造函数的调...
      99+
      2022-11-13
      C++构造函数的作用 C++构造函数的写法
    • C++中如何使用类对象构造函数
      C++中如何使用类对象构造函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于普通类型的对象来说,他们之间的复制是很简单的,自己定义的类的对象同样是对象,谁也...
      99+
      2023-06-17
    • C++中类对象的拷贝构造函数
      本篇内容主要讲解“C++中类对象的拷贝构造函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中类对象的拷贝构造函数”吧!拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一...
      99+
      2023-06-17
    • C++类、对象、构造函数及析构函数怎么定义使用
      这篇文章主要介绍“C++类、对象、构造函数及析构函数怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++类、对象、构造函数及析构函数怎么定义使用”文章能帮助大家解决问题。C++类与对象C...
      99+
      2023-07-06
    • C#中构造函数如何使用
      C#中构造函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#构造函数在使用方面及行为方面的一些特殊规则:如果开发人员没有为一个类提供构造函数,那么,...
      99+
      2023-06-17
    • C#中如何使用结构体构造函数
      本篇文章给大家分享的是有关C#中如何使用结构体构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。///〈summary〉  ///启动服务端的参数结构&...
      99+
      2023-06-17
    • 如何对C++虚基类构造函数
      这篇文章将为大家详细讲解有关如何对C++虚基类构造函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进...
      99+
      2023-06-17
    • C++类构造函数如何使用
      本篇文章给大家分享的是有关C++类构造函数如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。所谓C++类是定义同一类所有对象的变量和方法的蓝图或原型,C++类体内的成员是需...
      99+
      2023-06-17
    • C#中静态构造函数如何使用
      C#中静态构造函数如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#静态构造函数是一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。...
      99+
      2023-06-17
    • JavaScript如何创建对象的构造函数
      这篇文章给大家分享的是有关JavaScript如何创建对象的构造函数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建对象的构造函数function Person(fi...
      99+
      2022-10-19
    • C#中怎么使用构造函数
      本篇文章给大家分享的是有关C#中怎么使用构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简...
      99+
      2023-06-17
    • C++11中委托构造函数如何使用
      这篇文章将为大家详细讲解有关C++11中委托构造函数如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++11之前的状况构造函数多了以后,几乎必然地会出现代码重复的情况,为了避免这种情...
      99+
      2023-06-19
    • vue里面如何使用构造函数
      在vue中使用构造函数的方法:1.新建html项目,引入vue;2.使用new Vue()方法定义构造函数;3.使用模板语法调用构造函数;具体方法如下:首先,新建一个html项目,并在项目中引入vue;#通过文件方式引入<script...
      99+
      2022-10-20
    • C++中如何使用函数对象
      C++中如何使用函数对象,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。适合对属于基本数据类型的对象排序,它使用<作为排序比较规则,第2种语法则是根据指定排序规则comp来...
      99+
      2023-06-17
    • 如何通过构造函数实例化对象
      这篇文章主要介绍如何通过构造函数实例化对象,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如下所示: @Data public class Person ...
      99+
      2022-10-19
    • C++中拷贝构造函数的使用
      目录拷贝构造函数1. 手动定义的拷贝构造函数2. 合成的拷贝构造函数总结拷贝构造函数 拷贝构造函数,它只有一个参数,参数类型是本类的引用。复制构造函数的参数可以是 const 引用,...
      99+
      2022-11-13
    • JavaScript如何在构造函数中给对象添加方法
      小编给大家分享一下JavaScript如何在构造函数中给对象添加方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!构造函数中给对象添加方法// 给对象添...
      99+
      2023-06-03
    • PHP中构造函数如何使用
      这篇文章将为大家详细讲解有关PHP中构造函数如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP经过长时间的发展,很多用户都很了解PHP了,这里我发表一下个人理解,和大家讨论讨论。大...
      99+
      2023-06-17
    • PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
      PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用 PHP 面向对象1.构造函数2.析构函数3.继承4....
      99+
      2023-09-02
      php 开发语言 java
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作