在C++中,对比构造函数和析构函数,请简述它们有哪些相同的特点及分别有何作用
时间: 2023-06-18 11:07:57 浏览: 139
构造函数和析构函数是 C++ 中类的两个特殊成员函数,它们有以下相同的特点:
1. 都是自动调用的函数,不需要手动调用;
2. 都没有返回值;
3. 都可以被重载。
构造函数的作用是在创建对象时初始化对象的成员变量。即在对象创建时,自动调用构造函数,对对象进行初始化。构造函数的名字必须与类名相同,没有返回值类型,可以有参数或者没有参数,如果没有显式定义构造函数,则编译器会自动生成一个默认构造函数。
析构函数的作用是在对象被销毁时释放对象占据的资源。即在对象销毁时,自动调用析构函数,对对象进行资源的释放。析构函数的名字必须与类名相同,在名字前面添加 ~ 符号,没有返回值类型,不接受任何参数。
总之,构造函数和析构函数是 C++ 中重要的函数,构造函数负责初始化对象,析构函数负责释放资源,两者结合起来,可以实现 C++ 中面向对象编程的核心思想:封装、继承和多态。
相关问题
cpp简述调用复制构造函数的几种情况
C++中的复制构造函数是一种特殊的构造函数,用于创建一个新对象并将其初始化为另一个同类型的对象。复制构造函数在以下情况下会被调用:
1. 使用一个对象初始化另一个对象
```cpp
MyClass obj1; // 创建对象obj1
MyClass obj2(obj1); // 使用obj1初始化obj2,调用复制构造函数
```
2. 将一个对象作为函数参数传递给函数时,会调用复制构造函数来创建一个副本
```cpp
void func(MyClass obj) {
// 函数体
}
MyClass obj; // 创建对象obj
func(obj); // 将obj作为参数传递给函数,调用复制构造函数
```
3. 从函数中返回一个对象的副本时,会调用复制构造函数
```cpp
MyClass func() {
MyClass obj; // 创建对象obj
return obj; // 返回obj的副本,调用复制构造函数
}
```
4. 用花括号初始化列表创建对象时
```cpp
MyClass obj = {1, 2, 3}; // 用花括号初始化列表创建对象,调用复制构造函数
```
需要注意的是,如果类中没有定义复制构造函数,编译器会自动生成一个默认的复制构造函数。默认的复制构造函数只是简单地将一个对象的成员变量复制到另一个对象中,效果类似于浅拷贝。如果类中有指针等需要特殊处理的资源,就需要自定义复制构造函数来进行深拷贝或其他必要的操作。
使用c++语言基于GUI编写一个通讯录系统实现对联系人信息的保存和增删查改等操作。 要求所有函数都是lambd函数, 要求使用构造函数、友元函数、指针等, 要求实现用户异常处理, 包含五个模块
在C++中,基于GUI(图形用户界面)编写一个通讯录系统可以使用Qt库,它是一个强大的跨平台应用程序框架,支持窗口和控件的设计。这里简述如何构建一个基本的通讯录系统,包括五个核心模块,每个模块都有一个相关的lambda函数:
1. **Contact** 类 (构造函数、成员变量):
- 构造函数接受姓名、电话号码等属性作为参数,并存储在智能指针中(避免内存泄漏)。
```cpp
class Contact {
public:
Contact(const std::string& name, const std::string& phoneNumber) : name_(name), phone_(phoneNumber) {}
// 使用指针存储数据
std::shared_ptr<std::string> getName() { return name_; }
std::shared_ptr<std::string> getPhoneNumber() { return phone_; }
private:
std::shared_ptr<std::string> name_;
std::shared_ptr<std::string> phone_;
};
```
2. **ContactBook** 类 (友元函数):
- 包含一个vector来存储Contact对象,以及添加、删除等操作的lambda函数。
- 友元函数允许直接访问Contact对象的私有成员。
```cpp
class ContactBook {
public:
void addContact(std::function<void(Contact&)> action) {
action(*contacts_.emplace_back());
}
void removeContact(const std::string& phoneNumber, std::function<bool(Contact&)> pred = nullptr) {
if (pred) {
auto it = std::find_if(contacts_.begin(), contacts_.end(), pred);
if (it != contacts_.end())
contacts_.erase(it);
} else {
contacts_.erase(std::remove_if(contacts_.begin(), contacts_.end(),
[phoneNumber](const Contact& c){return c.getPhoneNumber()->equals(phoneNumber);}),
contacts_.end());
}
}
private:
std::vector<Contact> contacts_;
};
// 友元函数示例
void saveContact(Contact& contact) {
// 实现保存到文件或数据库的操作
}
```
3. **MainWindow** 类 (GUI交互):
- 使用Qt的QWidgets库设计窗口,包含添加、删除、查找、编辑联系人的按钮,点击事件通过lambda函数连接。
```cpp
class MainWindow : public QMainWindow {
public slots:
void onAddButtonClicked() { contactBook_.addContact([](Contact& c) { saveContact(c); }); }
... // 删除、查找、编辑按钮的槽函数类似
private:
ContactBook contactBook_;
};
```
4. **异常处理**:
- 在关键操作如文件读写或网络请求时加入异常捕获,使用try-catch blocks。
```cpp
void saveContact(const Contact& contact) {
try {
// 执行保存操作
} catch (std::exception& e) {
qCritical("Error saving contact: %s", e.what());
}
}
```
5. **主程序入口**:
- 初始化Qt应用,创建窗口并运行。
```cpp
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
```
阅读全文