当前位置: 首页 > news >正文

【C/C++】C++11 类的 默认构造函数 “= default” 用法

到底要不要使用 = default 声明默认构造函数?

两种情况对比

情况1:使用类内初始化,不写默认构造函数

class Rectangle {
private:double width {1.0};double height {1.0};std::string name {"Rectangle"};public:// 没有声明默认构造函数// 编译器会自动生成一个Rectangle(double w, double h, const std::string& n) : width(w), height(h), name(n) {}void print() {std::cout << name << ": " << width << " x " << height << std::endl;}
};

情况2:使用类内初始化,显式写 = default

class Rectangle {
private:double width {1.0};double height {1.0};std::string name {"Rectangle"};public:Rectangle() = default;  // 显式要求编译器生成默认构造函数Rectangle(double w, double h, const std::string& n) : width(w), height(h), name(n) {}void print() {std::cout << name << ": " << width << " x " << height << std::endl;}
};

关键区别

不写默认构造函数时:

  • 编译器会自动生成一个默认构造函数
  • 这个自动生成的构造函数会使用类内初始值来初始化成员变量
  • 可以正常创建对象:Rectangle rect;

显式写 = default 时:

  • 效果与编译器自动生成的完全相同
  • 只是更明确地表达了设计意图

实际测试

#include <iostream>
#include <string>class RectangleA {
private:double width {1.0};double height {1.0};std::string name {"Rectangle"};
public:// 没有默认构造函数声明void print() {std::cout << name << ": " << width << " x " << height << std::endl;}
};class RectangleB {
private:double width {1.0};double height {1.0};std::string name {"Rectangle"};
public:RectangleB() = default;  // 显式默认void print() {std::cout << name << ": " << width << " x " << height << std::endl;}
};int main() {RectangleA rect1;  // 正常工作!使用类内初始值RectangleB rect2;  // 正常工作!使用类内初始值rect1.print();  // 输出: Rectangle: 1 x 1rect2.print();  // 输出: Rectangle: 1 x 1return 0;
}

什么时候需要显式写 = default

在以下几种情况下需要:

1. 有其他构造函数时

class Rectangle {
private:double width {1.0};double height {1.0};
public:// 如果只有这个构造函数,默认构造函数不会被自动生成Rectangle(double w, double h) : width(w), height(h) {}// 需要显式要求编译器生成默认构造函数Rectangle() = default;
};

2. 需要明确的代码文档

class Rectangle {
private:double width {1.0};double height {1.0};
public:Rectangle() = default;  // 明确表示:我需要默认构造函数// 其他代码...
};

3. 在头文件中显式定义,在源文件中实现特殊逻辑

// .h 文件
class Rectangle {
private:double width {1.0};double height {1.0};
public:Rectangle();  // 声明但不 = default
};// .cpp 文件
Rectangle::Rectangle() {// 可能有一些特殊的初始化逻辑std::cout << "Rectangle created with default values" << std::endl;
}

总结

  • 不写默认构造函数:编译器自动生成,使用类内初始值 ✅
  • = default:效果相同,但更明确意图 ✅
  • 只有在有其他构造函数时,才需要显式写 = default 来保留默认构造函数
http://www.dtcms.com/a/594162.html

相关文章:

  • 自己建的网站可以用笔记本做服务器吗推广网站建设产品介绍
  • 嵌入式C语言中结构体使用方法与技巧
  • 深度学习(1)—— 基本概念
  • 【Java EE进阶 --- SpringBoot】Spring 核心 --- AOP
  • 4.95基于8086流水灯霓虹彩灯控制器,8086彩灯控制器proteus8.9仿真文件+源码功能四个开关对应四种模式。
  • 网站做百度推广需要什么材料专业的网站制作公司哪家好
  • 在 Ubuntu Desktop Linux 下解压7z文件的完整指南
  • 网站建设工作都包括哪些方面网站论文首页布局技巧
  • 国内做视频的网站网站优化需要做什么
  • 用 LangGraph + MCP Server 打造 SpreadJS 智能助手:让 AI 真正懂你的表格需求
  • 做网站用php还是node外贸网站 备案
  • 行业门户网站源码列举五种网络营销模式
  • 摄影建设网站wordpress插件装多了卡
  • 画世界Pro笔刷大全!含导入教程与多风格笔刷合集
  • 彩笔运维勇闯机器学习--多元线性回归(实战)
  • 免费推广店铺的网站网站默认首页怎么做
  • leetcode1377.T秒后青蛙的位置
  • 基于Yolo的图像识别中的特征融合
  • C语言自定义数据类型详解
  • 社交网站开发 转发建设网站的好处和优点
  • VBUS(Voltage Bus,电压总线) 是什么?
  • 前端做的网站潮阳网站制作
  • 北京哪家公司做网站好网站建设开发报价方案模板
  • 国家商标注册官网查询系统南京seo顾问
  • cpa单页网站怎么做sae wordpress 4.3
  • Vite与Webpack完全指南:从零开始理解前端构建工具
  • [优选算法专题六.模拟 ——NO.37~39 替换所有的问号、提莫攻击、Z 字形变换]
  • 【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 4
  • HOT100题打卡第34天——二分查找
  • 电子商务网站的作用单位网站建设情况