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
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以通过对象数组初始化来创建一个由多个对象组成的数组。对象数组初始化的方式有多种,下面是其中两种常用的方式: 1. 使用默认构造函数初始化对象数组 如果中有默认构造函数,那么可以使用以下方式初始化对象数组: ```cpp class MyClass { public: MyClass() { // 默认构造函数 } }; int main() { MyClass arr[5]; // 创建由5个MyClass对象组成的数组 return 0; } ``` 在上面的例子中,`MyClass arr[5]` 创建了一个由5个MyClass对象组成的数组,这些对象都是使用默认构造函数初始化的。 2. 使用带参数的构造函数初始化对象数组 如果中有带参数的构造函数,那么可以使用以下方式初始化对象数组: ```cpp class MyClass { public: MyClass(int x) { // 带参数的构造函数 } }; int main() { MyClass arr[5] = {MyClass(1), MyClass(2), MyClass(3), MyClass(4), MyClass(5)}; // 创建由5个MyClass对象组成的数组,并使用带参数的构造函数初始化 return 0; } ``` 在上面的例子中,`MyClass arr[5]` 创建了一个由5个MyClass对象组成的数组,并使用带参数的构造函数初始化。也可以使用的默认构造函数来初始化数组的一部分元素,例如: ```cpp class MyClass { public: MyClass() { // 默认构造函数 } MyClass(int x) { // 带参数的构造函数 } }; int main() { MyClass arr[5] = {MyClass(1), MyClass(), MyClass(3)}; // 创建由5个MyClass对象组成的数组,并使用带参数的构造函数和默认构造函数初始化 return 0; } ``` 在上面的例子中,`MyClass arr[5]` 创建了一个由5个MyClass对象组成的数组,并使用带参数的构造函数和默认构造函数初始化。其中,第一个和第三个元素使用带参数的构造函数初始化,第二个元素使用默认构造函数初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值