缺省参数与缺省函数的区别

缺省参数是在函数声明或定义时为函数参数指定的默认值。如果在函数调用时没有为这些参数提供值,编译器将自动使用这些默认值。这是通过在参数列表中直接赋值来指定的。

以下是一个使用缺省参数的例子:

cpp 复制代码
cpp

void printInfo(const std::string& name = "Unknown", int age = -1) {

std::cout << "Name: " << name << ", Age: " << age << std::endl;

}

int main() {

printInfo(); // 使用缺省参数,输出: Name: Unknown, Age: -1

printInfo("Alice"); // 只提供第一个参数,输出: Name: Alice, Age: -1

printInfo("Bob", 30); // 提供所有参数,输出: Name: Bob, Age: 30

return 0;

}

缺省函数是编译器在程序员没有显式定义的情况下自动生成的特殊成员函数,如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等。这些函数的生成是为了确保类对象能够进行基本的操作,即使没有明确提供相应的函数定义。

以下是一个包含缺省函数的例子:

cpp 复制代码
cpp

class MyClass {

public:

MyClass() {} // 缺省构造函数

MyClass(const MyClass& other) {} // 缺省拷贝构造函数

MyClass& operator=(const MyClass& other) { return *this; } // 缺省拷贝赋值运算符

~MyClass() {} // 缺省析构函数

};

int main() {

MyClass obj1;

MyClass obj2 = obj1; // 使用缺省拷贝构造函数

obj2 = obj1; // 使用缺省拷贝赋值运算符

return 0;

}

在这个例子中,即使我们没有显式定义拷贝构造函数和拷贝赋值运算符,编译器也会为我们生成缺省的版本。

缺省函数都有哪些??

在C++中,缺省函数(default function)指的是编译器在程序员没有显式提供时自动生成的特殊成员函数。这些函数包括:

  1. 缺省构造函数(default constructor):如果没有为类定义任何构造函数,编译器会提供一个不带参数的构造函数,这个构造函数会调用基类和成员变量的缺省构造函数(如果有的话)。

  2. 析构函数(destructor):如果类没有定义析构函数,编译器会提供一个缺省的析构函数,这个析构函数通常是空的,除非类有成员需要特殊的清理操作。

  3. 拷贝构造函数(copy constructor):如果没有为类定义拷贝构造函数,编译器会提供一个缺省的拷贝构造函数,它执行成员的逐位拷贝(浅拷贝)。

  4. 拷贝赋值运算符(copy assignment operator):如果程序员没有为类定义拷贝赋值运算符,编译器会提供一个缺省的拷贝赋值运算符,它执行成员的逐位赋值。

  5. 移动构造函数(move constructor)和移动赋值运算符(move assignment operator)(C++11及以后版本):在C++11中,如果程序员没有定义这些函数,编译器也会提供缺省的实现。

cpp 复制代码
cpp

class MyClass {

public:

MyClass() = default; // 显式要求编译器生成缺省构造函数

MyClass(const MyClass& other) = default; // 显式要求编译器生成拷贝构造函数

MyClass& operator=(const MyClass& other) = default; // 显式要求编译器生成拷贝赋值运算符

~MyClass() = default; // 显式要求编译器生成析构函数

private:

int value;

};

int main() {

MyClass obj1;

MyClass obj2 = obj1; // 使用缺省拷贝构造函数

obj2 = obj1; // 使用缺省拷贝赋值运算符

return 0;

}

提示:

在上面的代码中,= default;告诉编译器生成缺省版本的函数。即使我们不显式要求,编译器也会在需要时自动生成这些函数。

需要注意的是,如果类中定义了任何形式的构造函数(包括拷贝构造函数或移动构造函数),编译器就不会生成缺省构造函数。同样,如果定义了拷贝赋值运算符或移动赋值运算符,编译器也不会生成缺省的拷贝赋值运算符。如果需要,可以通过显式使用= default;来要求编译器生成这些函数。

相关推荐
牛油果子哥q4 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客4 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
ysa0510304 小时前
c++常用自带函数用法与注意
c++·笔记·算法
鸿芯微控科技9 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号
三十岁老牛再出发9 小时前
08.18每日总结
c++·python·numpy·pandas
余额瞒着我当琳10 小时前
C++--vector底层,leetcode118杨辉三角实战,对于传统reserve的坑点,迭代器失效
开发语言·c++
醉城夜风~10 小时前
(超详细)C++多态(Polymorphism)
开发语言·c++
小小龙学IT11 小时前
现代 C++ 内存管理与资源安全深度解析:从 RAII 到所有权模型
c++·安全
欧特克_Glodon11 小时前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
神仙别闹11 小时前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc