C++ 类对象初始化

一、默认初始化

当创建一个类的实例时,如果没有定义构造函数,系统会自动生成一个无参构造函数,并自动初始化成员变量。内置类型的变量(如int、double、指针等)会被初始化为一个未定义的值,而自定义类型的变量(如类、结构体)会调用默认构造函数进行初始化。

代码示例:

class MyClass {
public:
    int num;
    std::string str;

    MyClass() {} // 默认构造函数
};

MyClass obj; // 默认初始化对象,num和str的值赋为默认值

 二、有参构造函数

列表初始化:使用花括号 {} 进行初始化,提供了更严格的类型匹配和防止窄化转换的特性。

代码示例;

class MyClass {
public:
    int num;
    std::string str;

    MyClass(int n, const std::string& s) : num(n), str(s) {} // 带参数的构造函数
};

MyClass obj{10, "Hello"}; // 列表初始化对象,使用参数值进行初始化

三、拷贝构造函数

拷贝构造函数是用来创建一个对象的副本的特殊构造函数。在C++中,拷贝构造函数通常有以下几种实现方式:

1、浅拷贝:简单地将一个对象的成员变量逐个复制到另一个对象中。这种方式适用于没有指针等动态分配内存的简单对象。        ·

ClassName(const ClassName& other) {//常量引用,防止修改
    member1 = other.member1;
    member2 = other.member2;
    // 其他成员变量的赋值
}

2、深拷贝:当对象中有指针等动态分配内存的成员变量时,需要进行深拷贝,即重新分配内存并将原对象的数据复制过去。

ClassName(const ClassName& other) {
    member1 = new int(*other.member1); // 假设member1是int类型指针
    member2 = new char(*other.member2); // 假设member2是char类型指针
    // 其他成员变量的深拷贝
}

注:浅拷贝构造函数和赋值运算符重载可以由系统提供,可以不写,不过如果涉及到成员变量是指针的情况,需要采用深拷贝,系统无法提供,需要手动写入。

另外需要分辨出浅拷贝和赋值拷贝的区别

代码示例:

#include <iostream>
#include <string>
using namespace std;

class Person{
    private:
        string name;
        int age;
    public:
        Person():name{},age{}{}
        Person(string name,int age):name{name},age{age}{}
        Person(const Person &other){
            this->age = other.age;
            this->name = other.name;
        }
        Person &operator=(Person &other)
        {
            if(this != &other)//排除自己给自己赋值
            {
                this->age = other.age;
                this->name = other.name;
            }
            return *this;//返回当前对象才能连续赋值
        }
        string getName()const
        {
            return name;
        }
        int getAge()const
        {
            return age;
        }
};
int main()
{
    Person p1("zhangsan",20);
    Person p2 = p1;//初始化,调用拷贝构造函数
    Person p3("list",21);
    Person p4(p3);//初始化,调用拷贝构造函数
    p3 = p1;//赋值,调用赋值运算符重载
    cout<<p1.getName()<<p1.getAge()<<endl;
    cout<<p2.getName()<<p2.getAge()<<endl;
    cout<<p3.getName()<<p3.getAge()<<endl;
    cout<<p4.getName()<<p4.getAge()<<endl;
    return 0;
}

运行结果:

zhangsan20
zhangsan20
zhangsan20
list21

相关推荐

  1. C++ 对象初始化

    2024-05-02 16:58:21       34 阅读
  2. C#中Lazy<T> 泛型(延迟初始化对象

    2024-05-02 16:58:21       51 阅读
  3. C#对象初始化

    2024-05-02 16:58:21       59 阅读
  4. C++Book对象数组初始化

    2024-05-02 16:58:21       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 16:58:21       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 16:58:21       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 16:58:21       82 阅读
  4. Python语言-面向对象

    2024-05-02 16:58:21       91 阅读

热门阅读

  1. SQL中为什么不要使用1=1?

    2024-05-02 16:58:21       36 阅读
  2. 知识图谱与大语言模型的协同(RAG)——MindMap

    2024-05-02 16:58:21       37 阅读
  3. 23种设计模式

    2024-05-02 16:58:21       35 阅读
  4. 速盾:高防cdn-为您的网站防御cc/ddos

    2024-05-02 16:58:21       36 阅读
  5. tomca打不开index.html的解决方案

    2024-05-02 16:58:21       33 阅读
  6. 【LeetCode刷题记录】简单篇-88-合并两个有序数组

    2024-05-02 16:58:21       33 阅读
  7. H2数据库常见问题

    2024-05-02 16:58:21       31 阅读
  8. Acwing 818. 数组排序

    2024-05-02 16:58:21       29 阅读
  9. 共享模型之不可变——不可变设计、享元模式

    2024-05-02 16:58:21       34 阅读
  10. flutter 开发实战常用

    2024-05-02 16:58:21       26 阅读
  11. 常见大模型框架

    2024-05-02 16:58:21       24 阅读
  12. 算法系列之二叉树中序遍历最佳实践你知道吗

    2024-05-02 16:58:21       35 阅读