广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C++构造函数
  • 603
分享到

详解C++构造函数

2024-04-02 19:04:59 603人浏览 独家记忆
摘要

目录1.作用2.代码举例2.1 示例1:2.2 示例2:3. 使用3.1 使用构造函数初始化3.2 有参数的构造函数3.3 默认的构造函数4. 成员初始化列表例1:正常初始化例2:成

1.作用

一种特殊类型的方法,在每次实例化对象时运行

2.代码举例

2.1 示例1:


#include <iOStream>
class A
{
    public:
        float a, b;
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    A a;
    a.print();
    return 1;
}

运行结果:

image-20211116163007112

当我们实例化A,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西

2.2 示例2:

当在main中添加 std::cout << a.a << " , " << a.b << std :: endl;


int main()
{
    A a;
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

ubuntu下 vs code )运行结果

image-20211116164058741

不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…

3. 使用

3.1 使用构造函数初始化


#include <iostream>
class A
{
    public:
        float a, b;
        A ()
        {
            a = 0.0f;
            b = 0.0f;
        }
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    A a;
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

结果:

image-20211116164932213

3.2 有参数的构造函数


#include <iostream>
class A
{
    public:
        float a, b;
    // 无参构造
    A ()
        {
            a = 0.0f;
            b = 0.0f;
        }
    // 有参构造
        A(float c,float d)
        {
            a = c;
            b = d;
        }
    
        void print()
        {
            std::cout << a <<  " ,  " << b << std :: endl;
        }
};
int main()
{
    A a(5.0,6.0);
    std::cout << a.a <<  " ,  " << a.b << std :: endl;
    a.print();
    return 1;
}

一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同

类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)


 A(float c,float d)
 {
 }
A(int c,int d)
{
}
A(float c,float d,float e)
{
}

这里需要注意有参构造的时候注意传值类型

float 类型


A a(5.0f , 6.0f);

3.3 默认的构造函数

每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)


A ()
{
}

如果不想使用构造函数有两种方法


// 1 私有化
private :
	A(){}
// 2 删掉
A() = delete;

4. 成员初始化列表

例1:正常初始化


#include <iostream>
using namespace std;
class Student
{
private:
    const char *m_name;
    int m_age;
    float m_score;
public:
    // 无参构造 给变量赋定值
    Student()
    {
        m_name = "aaa";
        m_age = 1;
        m_score = 99.0;
    }
    // 有参构造  给变量动态赋值
    Student(const char *name, int age, float score)
    {
        m_name = name;
        m_age = age;
        m_score = score;
    }
    void print ()
    {
        cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
    }
};
int main(int arGC, char const *argv[])
{
    Student s1;
    s1.print();
    Student s2("ccc" , 2 , 99.3f);
    s2.print();
    return 0;
}

例2:成员初始化列表


#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
    // string m_name;
    // char *m_name;
    const char *m_name;
    int m_age;
    float m_score;
public:   
    //  无参 成员初始化列表  
    Student() 
        : m_name("bbb") , m_age(2) , m_score(93.0f) 
    {
        // TODO
    }
    // 有参 成员初始化列表  
    
    Student(const char *name, int age, float score)
        : m_name(name) , m_age(age) , m_score(score)
    {
       // TODO
    }
    void print ()
    {
        cout << m_name << " ," << m_age  <<  " ," <<  m_score << endl;
    }
};
int main(int argc, char const *argv[])
{
    Student s1;
    s1.print();
    Student s2("ccc",2,99.3f);
    s2.print();
    return 0;
}

运行结果都一样:

aaa ,1 ,99
ccc ,2 ,99.3

使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。

初始化列表可以用于全部成员变量,也可以只用于部分成员变量


Student(char *name, int age, float score): m_name(name){
    m_age = age;
    m_score = score;
}

NOTE:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。

为啥推荐成员初始化列表的写法?


#include <iostream>
using namespace std;
class Example
{
public:
    Example()
    {
        cout<< "Create Example" << endl;
    }
    Example(int x)
    {
        cout<< "Create Example with "  << x << endl;
    }
};
class A
{
private:
    string m_name;
    // 创建了 Example 的无参构造 对象
    Example m_Example;
public:
    A()
    {
        m_name = "name";
        // 创建新的有参构造对象覆盖第一次赋值  
        m_Example = Example(1);
    }
};
int main(int argc, char const *argv[])
{
    A a;
    return 0;
}

结果:

image-20211117113259509

A的构造函数换成成员初始化列表的写法


//    A() : m_name ("name"),m_Example(Example(1))  		与下面写法相同
A() : m_name ("name"),m_Example(1)
    {
    }

结果:

image-20211117113805527

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 详解C++构造函数

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

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

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

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

下载Word文档
猜你喜欢
  • 详解C++构造函数
    目录1.作用2.代码举例2.1 示例1:2.2 示例2:3. 使用3.1 使用构造函数初始化3.2 有参数的构造函数3.3 默认的构造函数4. 成员初始化列表例1:正常初始化例2:成...
    99+
    2022-11-12
  • C#构造函数详解
    一、简介 构造函数,基本用法是在类对象声明的时候完成初始化工作。 二、实例构造函数 1、构造函数的名字与类名相同。 2、使用 new 表达式创建类的对象或者结构(例如int)时,会调...
    99+
    2022-11-13
  • C++构造函数详解
    文章转自公众号:Coder梁(ID:Coder_LT) 上一篇文章我们介绍了定义了类,在使用之前,往往还需要对类进行初始化。这篇介绍的就是对类进行初始化的方法。 像是结构体,我们可以...
    99+
    2022-11-12
  • C++:构造函数,析构函数详解
    目录前言一、面向对象二、构造函数1.基本概念2.构造函数重载1.构造函数分类2.有参构造函数:3.有参构造函数3个调用规则:4.拷贝构造函数5.析构函数总结前言 上期了解C++类中有...
    99+
    2022-11-12
  • C++中构造函数详解
    构造函数按参数为为:有参构造函数和无参构造函数 按类型分为:普通构造函数和拷贝构造函数 构造函数的三种调用方法:括号法,显示法,隐式转换法; //括号法 Person p1; ...
    99+
    2022-11-13
  • c++特殊构造函数详解
    目录前言拷贝构造函数一、什么是拷贝构造函数二、调用时机注意浅拷贝和深拷贝总结前言 众所周知,构造函数的作用是类在创建对象时的初始化,而拷贝构造函数则是构造函数里的一种特殊构造。 拷贝...
    99+
    2022-11-12
  • C++中的构造函数详解
    目录普通变量的初始化构造函数一定会生成默认构造函数吗?防止隐式类型转换赋值与初始化的区别对象的计数成员初始化的顺序类的引用成员构造函数使用注意事项参考总结普通变量的初始化 当我们在定...
    99+
    2022-11-12
  • C++超详细讲解构造函数
    目录类的6个默认成员函数构造函数特性编译器生成的默认构造函数成员变量的命名风格类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函...
    99+
    2022-11-13
  • C++中的复制构造函数详解
    目录复制构造函数复制构造函数的三种调用复制构造函数的禁用深拷贝与浅拷贝一定会生成默认复制构造函数吗?参考 总结普通变量的复制 有时我们会在定义一个变量的同时使用另一个变量来初始化它。...
    99+
    2022-11-12
  • C++中的拷贝构造函数详解
    目录C++拷贝构造函数(复制构造函数)详解1) 为什么必须是当前类的引用呢?2) 为什么是 const 引用呢?默认拷贝构造函数总结C++拷贝构造函数(复制构造函数)详解 拷贝和复制...
    99+
    2022-11-13
  • C++超详细讲解拷贝构造函数
    目录构造函数特征编译器生成的拷贝构造拷贝构造的初始化列表显式定义拷贝构造的误区结论构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对...
    99+
    2022-11-13
  • C++类与对象及构造函数析构函数基础详解
    目录C++类与对象类的定义对象的创建构造函数和析构函数访问修饰符继承多态成员变量与成员方法总结C++类与对象 C++是一门面向对象的编程语言。在C++中,我们可以利用类来创建对象,...
    99+
    2023-05-16
    C++类对象函数 c++ 构造析构函数
  • C++构造析构赋值运算函数应用详解
    目录了解C++默默编写哪些函数不想使用编译器函数为多态基类声明virtual析构函数别让异常逃离析构函数绝不在构造和析构过程中调用virtual函数令operator=返回一个ref...
    99+
    2022-11-13
  • C# Record构造函数的行为更改详解
    如何更改 C# Record 构造函数的行为 Record[1] 是 C# 9 中的一个新功能。Record是从Structs[2]借用的特殊类, 因为它们具有 基于值的相等性,您可...
    99+
    2022-11-12
  • C++中拷贝构造函数的总结详解
    1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这...
    99+
    2022-11-15
    拷贝构造函数 C++
  • C++构造函数的初始化列表详解
    目录1.问题2.解决方法(初始化列表)3.顺序问题总结 1.问题 class A { private: int m_a; public: A(int a) { cout ...
    99+
    2022-11-12
  • C++编程析构函数拷贝构造函数使用示例详解
    目录构造函数析构函数拷贝构造之深拷贝和浅拷贝深浅拷贝区别首先定义一个类进行操作。 class MM { public: protected: int year; ...
    99+
    2022-11-12
  • C++类与对象深入之构造函数与析构函数详解
    目录对象的初始化和清理一:构造函数1.1:构造函数的特性1.2:构造函数的分类二:析构函数2.1:概念2.2:特性三:拷贝构造函数3.1:概念3.2:特性3.3:拷贝构造函数调用时机...
    99+
    2022-11-13
  • C++赋值函数+移动赋值函数+移动构造函数详解
    目录左值引用和右值引用左值与右值左右值的切换左值引用:将左值绑定在引用上常量左值引用和非常量左值引用右值引用:将右值绑定在引用上常量右值引用和非常量右值引用移动构造函数赋值和移动赋值...
    99+
    2022-11-13
  • C++实现拷贝构造函数的方法详解
    目录引入一.什么是拷贝构造函数二.什么情况下使用拷贝构造函数三.使用拷贝构造函数需要注意什么四.深拷贝浅拷贝4.1 浅拷贝4.2 深拷贝引入 对于普通类型的对象来说,他们之间的复制很...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作