普通实例化

在 C++ 中,struct 和 class 在实例化时的语法是相同的。两者在实例化时都可以使用以下方式:

// 使用 class 定义和实例化
class Solution {
public:
    void printMessage() {
        std::cout << "Hello from Solution!" << std::endl;
    }
};

Solution solu; // 实例化一个 Solution 类型的对象

// 使用 struct 定义和实例化
struct Data {
    int value;
    void printValue() {
        std::cout << "Value: " << value << std::endl;
    }
};

Data dataInstance; // 实例化一个 Data 类型的对象

区别

实例化方式

new 关键字实例化

在 C++ 中,无论是 class 还是 struct,都可以使用 new 关键字进行动态内存分配。new 关键字会在堆上分配内存并返回对象的指针。

使用 new 关键字实例化 class 和 struct

class 的实例化:

class Solution {
public:
    void printMessage() {
        std::cout << "Hello from Solution!" << std::endl;
    }
};

// 使用 new 关键字实例化 Solution
Solution* solu = new Solution(); // 返回的是指向 Solution 的指针

// 使用指针调用成员函数
solu->printMessage();

// 释放内存
delete solu;

struct 的实例化:

struct Data {
    int value;
    void printValue() {
        std::cout << "Value: " << value << std::endl;
    }
};

// 使用 new 关键字实例化 Data
Data* dataInstance = new Data(); // 返回的是指向 Data 的指针

// 使用指针调用成员函数和访问成员变量
dataInstance->value = 42;
dataInstance->printValue();

// 释放内存
delete dataInstance;

说明

使用 new 的优势

注意事项

#include <memory>

std::unique_ptr<Solution> solu = std::make_unique<Solution>();
solu->printMessage(); // 无需手动 delete,智能指针会自动释放内存

使用 new 和 delete 可以让你更好地控制对象的生命周期和内存管理,但使用智能指针更安全,推荐在现代 C++ 中使用智能指针来替代原生指针。


###注意和 Python 中的实例化写法作区分:

在 Python 中,实例化 class 和 struct(在 Python 中没有特定的 struct 关键字,一般使用 class 来表示结构体)是非常简单和直观的,直接通过调用类的构造函数即可。Python 不像 C++ 那样有 new 关键字,因为它的内存管理由 Python 解释器自动处理。

Python 中的类实例化

在 Python 中,实例化类的语法是:

class Solution:
    def __init__(self):
        print("Solution instance created")
    
    def print_message(self):
        print("Hello from Solution!")

# 实例化一个 Solution 对象
solu = Solution()  # 直接调用类名即可
solu.print_message()  # 调用实例方法

Python 中的内存管理

Python 中的“结构体”

在 Python 中,没有类似于 C++ 的 struct,但可以通过 class 定义简单的数据结构,或者使用 namedtuple 或 dataclass 来实现轻量级的结构体。

使用 class:

class Data:
    def __init__(self, value):
        self.value = value

data_instance = Data(42)
print(data_instance.value)  # 输出 42

使用 namedtuple:

from collections import namedtuple

Data = namedtuple('Data', ['value'])
data_instance = Data(42)
print(data_instance.value)  # 输出 42

使用 dataclass(Python 3.7+):

from dataclasses import dataclass

@dataclass
class Data:
    value: int

data_instance = Data(42)
print(data_instance.value)  # 输出 42

总结