C/C++编程:默认构造函数

1059 篇文章 274 订阅

由来

先看下面代码
在这里插入图片描述
代码内容很简单,定义了一个包含成员x,y的类Point。在序列的地方可以使用这个类
在这里插入图片描述
虽然我们并没有定义Point类的构造函数,我们依然可以定义Point类的pt对象并使用它,其原因是编译器会自动生成一个缺省的构造函数,其效果相当于
在这里插入图片描述
但是,一旦添加了其他有参数的构造函数,编译器就不再生成缺省的构造函数了
在这里插入图片描述

C++11的解决方案

C++11允许我们使用=default来要求编译器生成一个默认构造函数:
在这里插入图片描述
这样,我们就可以继续我们的美好生活了。

#include <stdio.h>

struct Point {
    Point() = default;
    Point(int _x, int _y) : x(_x), y(_y){}
    int x;
    int y;
};


int main() {
    Point point;
    printf("%d, %d", point.x, point.y);
}

在这里插入图片描述

如果是自己编写的无参构造函数的话,就需要指定成员的构造方式。默认构造函数会对数据成员进行默认初始化,不需要另外指定。这样可以省去一些麻烦。

由于整数是内置类型,而整数成员的默认初始化是不初始化,所以本例中的x,y还是需要类内初始化。这是另一个话题。

定义

默认构造函数:是无参调用的构造函数,包括两种:

  • 没有参数
  • 每个参数有初始值
class Box {
public:
    Box() { /*执行任何必需的默认初始化步骤*/}
    //所有参数都有默认值
    Box (int w = 1, int l = 1, int h = 1): m_width(w), m_height(h), m_length(l){}
...
}

调用场合

默认构造函数在默认初始化值初始化中得到调用。

  • 默认初始化:在不使用初始化器构造变量时执行的初始化。
  • 值初始化:在以空初始化器构造对象时进行的初始化

说人话:如果构造函数在未指定参数或者提供了一个空初始化器列表,则会调用默认构造函数:

vector v1;
vector v2{};

说明

默认构造函数是一种特殊的成员函数。如果未在类中声明任何构造函数,则编译器将提供隐式的inline默认构造函数

#include <iostream>
using namespace std;

class Box {
public:
    int Volume() {return m_width * m_height * m_length;}
private:
    int m_width { 0 };
    int m_height { 0 };
    int m_length { 0 };
};

int main() {
    Box box1; //调用编译器生成的构造函数
    cout << "box1.Volume: " << box1.Volume() << endl; // Outputs 0
}

如果声明了任何非默认构造函数、编译器不会提供默认构造函数

class Box {
public:
    Box(int width, int length, int height)
        : m_width(width), m_length(length), m_height(height){}
private:
    int m_width;
    int m_length;
    int m_height;

};

int main(){

    Box box1(1, 2, 3);
    Box box2{ 2, 3, 4 };
    Box box3; // C2512: no appropriate default constructor available
}

如果类中没有默认构造函数,将无法通过单独使用方括号语法来构造该类的对象数组。 例如,在前面提到的代码块中,框的数组无法进行如下声明:

Box boxes[3]; // C2512: no appropriate default constructor available

但是,可以使用一组初始值设定项列表来初始化 Box 对象的数组:

Box boxes[3]{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

语法

语法:

语法说明o
类名 ( ) ;(1)
类名 :: 类名 ( ) 函数体(2)
类名() = delete ;(3)C++11起
类名() = default ;(4)C++11起
类名 :: 类名 ( ) = default ; (5)C++11起
其中 类名 必须指名当前类(或类模板的当前实例化),或在命名空间作用域或友元声明中声明时,必须是有限定的类名。
  1. 类定义中的默认构造函数声明
struct Point {
    Point(){  x = 0;  y = 0;};
    int x;
    int y;
};
  1. 类定义之外的默认构造函数的定义(该类必须包含一条声明1)
struct Point {
    Point();  //声明1
    int x;
    int y;
};
Point::Point(){
    x = 10;
    y = 0;
};
  1. 弃置的默认构造函数:若其被重载决议所选择,则程序编译失败。
struct Point {
    Point() = delete ;  // 错误:使用了被删除的函数‘Point::Point()’
    int x;
    int y;
};
  1. 预置的默认构造函数:即便其他构造函数存在,在某些情况下编译器会定义的隐式默认构造函数。
#include <stdio.h>

struct Point {
    Point() = default;
    Point(int _x, int _y) : x(_x), y(_y){}
    int x;
    int y;
};


int main() {
    Point point;
    printf("%d, %d", point.x, point.y);
}

在这里插入图片描述

  1. 类定义之外的预置的默认构造函数(该类必须包含一条声明 (1))。这种构造函数被当做是用户提供的(user-provided)(见下文以及值初始化)。
struct Point {
    Point() ;  // 错误:使用了被删除的函数‘Point::Point()’
    int x;
    int y;
};

Point::Point() = default;

隐式声明的默认构造函数

  • 什么叫做隐式声明:用户没有声明、编译器声明
  • 若不对类类型(struct、class 或 union)提供任何用户声明的构造函数,则编译器将始终声明一个作为其类的 inline public 成员的默认构造函数。
#include <stdio.h>

struct Point1 {
    int x;
    int y;
};

class Point2 {
public:
    int x;
    int y;
};
union Point3 {
    int x;
    int y;
};

int main() {
    Point1 point1;
    Point2 point2;
    Point3 point3;
    printf("%d, %d\n", point1.x, point1.y);
    printf("%d, %d\n", point2.x, point2.y);
    printf("%d, %d\n", point3.x, point3.y);
}

在这里插入图片描述

  • C++11起,当存在用户声明的构造函数时,用户仍可以关键词 default 强制编译器自动生成原本隐式声明的默认构造函数。
#include <stdio.h>

struct Point1 {
    Point1() = default;  // 必须,当用户最定义了有参构造函数时编译器不会自己生成默认构造函数
    Point1(int _x, int _y) : x(_x), y(_y){}
    int x;
    int y;
};

class Point2 {
public:
    Point2() = default; // 必须,当用户最定义了有参构造函数时编译器不会自己生成默认构造函数
    Point2(int _x, int _y) : x(_x), y(_y){}
    int x;
    int y;
};
union Point3 {
    Point3() = default; // 必须,当用户最定义了有参构造函数时编译器不会自己生成默认构造函数
    Point3(int _x) : x(_x){}
    int x;
    int y;
};

int main() {
    Point1 point1;
    Point2 point2;
    Point3 point3;
    printf("%d, %d\n", point1.x, point1.y);
    printf("%d, %d\n", point2.x, point2.y);
    printf("%d, %d\n", point3.x, point3.y);
}

在这里插入图片描述

  • 隐式声明(或在其首个声明被预置)的默认构造函数,具有动态异常说明 (C++17 前)异常说明 (C++17 起)中所描述的异常说明。

其他

内置类型被认为具有默认构造函数和拷贝构造函数。但是,对于内置类型的未初始化的非static变量,其默认构造函数不会被调用。内置整数类型的默认值为0,浮点数默认值为0.0,指针类型的默认值为nullptr

void f(){
	int a0;       //未初始化
	int a2{};     //初始化为0
	double d1{};  //初始化欸0.0
	char *p{};    //p变成nullprt

	int *p1 = new int;   //未初始化
	int *p2 = new int{}; //初始化为0
}

内置类型的构造函数最常用于模板参数:

template<typename T>
struct Handle{
	T * p;
	Handle(T *pp = new T{}) :p{pp}{}
};

Handler<int> px;  //会生成int{} --- 初始化为0

引用和const必须被初始化。因此,一个包含这些成员的类不能默认构造,除非程序员提供了类内成员初始化器或者定义了一个默认构造函数来初始化它们

int glob{9};

struct X{
    const int a1{7};  //ok
    const int a2;     //错误:需要一个用户自定义构造函数
    const int & r{9};  //ok
    int& r1{glob};    //ok
    int& r2;          //错误,需要一个用户自定义构造函数
};

X x;            //错误:X没有默认构造函数

实例

class A
{
public:
	A();  //没有参数
};
class B
{
public:
	explicit B(int x = 1, bool b = true);  //每个参数有初始值
	//explicit:阻止执行隐式转换,但是可以显示类型转换
};
class C
{
public:
	explicit C(int c);  //非默认构造函数
};

struct A
{
    int x;
    A(int x = 1): x(x) {} // 用户定义默认构造函数
};
 
struct B: A
{
    // 隐式定义 B::B(),调用 A::A()
};
 
struct C
{
    A a;
    // 隐式定义 C::C(),调用 A::A()
};
 
struct D: A
{
    D(int y): A(y) {}
    // 不会声明 D::D(),因为存在另一构造函数
};
 
struct E: A
{
    E(int y): A(y) {}
    E() = default; // 显式预置,调用 A::A()
};
 
struct F
{
    int& ref; // 引用成员
    const int c; // const 成员
    // F::F() 被隐式定义为弃置
};
 
int main()
{
    A a;
    B b;
    C c;
//  D d; // 编译错误
    E e;
//  F f; // 编译错误
}

https://author.baidu.com/home?from=bjh_article&app_id=1597683592389912

等待研究

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有表决权的成员之一,曾经写过另五本面向对象编程书籍,发表过150篇以上的文章,是多本计算机杂志的专栏作家。Eckel开创Software Development Conference的C++、Java、Python等多项研讨活动。拥有应用物理学学士和计算机工程学硕士学位。 目录 译者序 前言 第1章 对象导言 第2章 对象的创建与使用 第3章 C++中的C 第4章 数据抽象 第5章 隐藏实现 第6章 初始化与清除 第7章 函数重载与默认参数 第8章 常量 第9章 内联函数 第10章 名字控制 第11章 引用和拷贝构造函数 第12章 运算符重载 第13章 动态对象创建 第14章 继承和组合 第15章 多态性和虚函数 第16章 模板介绍 附录A 编码风格 附录B 编程准则 附录C 推荐读物 索引 第2卷:实用编程技术 出版者的话 专家指导委员会 译者序 前言 第一部分 建立稳定的系统 第1章 异常处理 第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引 
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 名字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理类型 60   2.5.1 类型别名 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命名空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针和数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break
这是DS小龙哥编写整理的C++入门指南PDF文档,适合C++初学者,C语言C++工程师当做入门工具书学习。PDF里有完整示例、知识讲解,平时开发都可以复制粘贴,非常便捷。 目前一共写了7章,后续会持续更新资源包,更新后重新下载即可。 这是目前书籍的目录: C++入门指南 1 一、 C++语言基本介绍与开发环境搭建 1 1.1 C++简介 1 1.2 面向对象编程 1 1.3 Windows系统下搭建C++学习环境 2 二、C++基础入门 16 2.1 C++类和对象 17 2.2 C++命名空间 18 2.3 std标准命名空间 20 2.4 C++新增的标准输入输出方法(cin和cout) 22 2.5 C++规定的变量定义位置 24 2.6 C++新增的布尔类型(bool) 24 2.7 C++ 新增的new和delete运算符 25 2.8 C++函数的默认参数(缺省参数) 26 2.9 C++函数重载详解 28 2.10 C++新增的引用语法 30 三、 C++面向对象:类和对象 34 3.1 类的定义和对象的创建 34 3.2 类的成员变量和成员函数 36 3.3 类成员的访问权限以及类的封装 38 3.4 C++类的构造函数与析构函数 39 3.5 对象数组 47 3.6 this指针 50 3.7 static静态成员变量 52 3.8 static静态成员函数 53 3.9 const成员变量和成员函数 55 3.10 const对象(常对象) 56 3.11 友元函数和友元类 58 3.11.3 友元类 61 3.12 C++字符串 62 四、C++面向对象:继承与派生 75 4.1 继承与派生概念介绍 75 4.2 继承的语法介绍 75 4.3 继承方式介绍(继承的权限) 76 4.4 继承时变量与函数名字遮蔽问题 79 4.5 基类和派生类的构造函数 82 4.6 基类和派生类的析构函数 83 4.7 多继承 85 4.8 虚继承和虚基类 88 五、C++多态与抽象类 91 5.1 多态概念介绍 91 5.2 虚函数 92 5.3 纯虚函数和抽象类 95 六、C++运算符重载 97 6.1 运算符重载语法介绍 97 6.2 可重载运算符与不可重载运算符 98 6.3 一元运算符重载 99 6.4 二元运算符重载 102 6.5 关系运算符重载 104 6.6 输入/输出运算符重载(>>、<<) 105 6.7 函数调用运算符 () 重载 106 6.8 重载[ ](下标运算符) 107 七、C++模板和泛型程序设计 108 7.1 函数模板 108 7.2 类模板 110
目录 1、 C++对C的扩展 1 1简单的C++程序 1 1.1求圆的周长和面积 1 1.2初学者易犯错误模型 3 2程序设计方法的发展历程 4 3 C语言C++语言关系 6 4 C++对C的加强 6 4.1 namespace命名空间 6 4.2 “实用性”增加 6 4.3 register关键字增强 6 4.4变量检测增强 6 4.5 struct类型加强 6 4.6 C++中所有的变量和函数都必须有类型 6 4.7新增Bool类型关键字 6 4.8三目运算符功能增强 6 5 C/C++中的const 6 1 const基础知识(用法、含义、好处) 6 2 C中“冒牌货” 6 3 const和#define相同之处 6 4 const和#define的区别 6 5 结论 6 6引用专题讲座 6 1引用(普通引用) 6 2常引用 6 3 const引用结论 6 4const修饰类 6 5综合练习 6 7C++对C的函数扩展 6 1 inline内联函数 6 2 默认参数 6 3 函数占位参数 6 4 默认参数和占位参数 6 5 函数重载(Overroad) 6 8附录 6 附录1:C++语言对C语言扩充和增强的几点具体体现 6 附录2:C语言register关键字—最快的关键字 6 一、皇帝身边的小太监----寄存器 6 2、类和对象 6 1前言 6 2类和对象 6 2.1 基本概念 6 2.2类的封装 6 2.3 C++面向对象程序设计举例 6 2.4 作业 6 3对象的构造和析构 6 3.1构造和析构函数 6 3.2构造函数的分类及调用 6 3.3构造函数调用规则研究 6 3.4深拷贝和浅拷贝 6 3.5多个对象构造和析构 6 3.6构造函数和析构函数的调用顺序研究 6 3.7构造函数和析构函数综合练习 6 3.8 对象的动态建立和释放 6 4静态成员变量成员函数 6 4.1静态成员变量 6 4.2静态成员函数 6 4.3综合训练 6 5 C++面向对象模型初探 6 5.1基础知识 6 5.2编译器对属性和方法的处理机制 6 5.3总结 6 5.4 this指针 6 5.5全局函数PK成员函数 6 6 6友元 6 6.1友元函数 6 6.2友元类 6 7强化训练 6 1 static关键字强化训练题 6 2 数组类封装 6 3小结 6 8运算符重载 6 8.1概念 6 8.2运算符重载的限制 6 8.3运算符重载编程基础 6 8.4运算符重载提高 6 8.5运算符重载在项目开发中的应用 6 8.7附录:运算符和结合性 6 2、 继承和派生 6 3.1继承概念 6 3.1.1类之间的关系 6 3.1.2继承关系举例 6 3.1.3 继承相关概念 6 3.1.4 派生类的定义 6 3.1.5 继承重要说明 6 3.2派生类的访问控制 6 3.2.1单个类的访问控制 6 3.2.2不同的继承方式会改变继承成员的访问属性 6 3.2.3“三看”原则 6 3.2.3派生类类成员访问级别设置的原则 6 3.2.4综合训练 6 3.3继承中的构造和析构 6 3.3.1类型兼容性原则 6 3.3.2继承中的对象模型 6 3.3.3继承中的构造析构调用原则 6 3.3.4继承与组合混搭情况下,构造和析构调用原则 6 3.3.5继承中的同名成员变量处理方法 6 3.3.6派生类中的static关键字 6 3.4多继承 6 3.4.1多继承的应用 6 3.4.2虚继承 6 3.5继承总结 6 4、多态 6 4.1多态 6 4.1.1问题引出 6 4.1.2面向对象新需求 6 4.1.3解决方案 6 4.1.4多态实例 6 4.1.5多态工程意义 6 4.1.6多态成立的条件 6 4.1.7多态的理论基础 6 4.2多态相关面试题 6 面试题1:请谈谈你对多态的理解 6 面试题2:谈谈C++编译器是如何实现多态 6 面试题3:谈谈你对重写,重载理解 6 #include <cstdlib> 6 #include <iostream> 6 using namespace std; 6 class Parent01 6 { 6 public: 6 Parent01() 6 { 6 cout<<"Parent01:printf()..do"<<endl; 6 } 6 public: 6 virtual void func() 6 { 6 cout<<"Parent01:void func()"<<endl; 6 } 6 virtual void func(int i) 6 { 6 cout<<"Parent:void func(int i)"<<endl; 6 } 6 virtual void func(int i, int j) 6 { 6 cout<<"Parent:void func(int i, int j)"<<endl; 6 } 6 }; 6 class Child01 : public Parent01 6 { 6 public: 6 //此处2个参数,和子类func函数是什么关系 6 void func(int i, int j) 6 { 6 cout<<"Child:void func(int i, int j)"<<" "<<i + j<<endl; 6 } 6 //此处3个参数的,和子类func函数是什么关系 6 void func(int i, int j, int k) 6 { 6 cout<<"Child:void func(int i, int j, int k)"<<" "<<i + j + k<<endl; 6 } 6 }; 6 void run01(Parent01* p) 6 { 6 p->func(1, 2); 6 } 6 int main() 6 { 6 Parent01 p; 6 p.func(); 6 p.func(1); 6 p.func(1, 2); 6 Child01 c; 6 //c.func(); //问题1 6 c.Parent01::func(); 6 c.func(1, 2); 6 run01(&p); 6 run01(&c); 6 system("pause"); 6 return 0; 6 } 6 //问题1:child对象继承父类对象的func,请问这句话能运行吗?why 6 //c.func(); //因为名称覆盖,C++编译器不会去父类中寻找0个参数的func函数,只会在子类中找func函数。 6 //1子类里面的func无法重载父类里面的func 6 //2当父类和子类有相同的函数名、变量名出现,发生名称覆盖(子类的函数名,覆盖了父类的函数名。) 6 //3//c.Parent::func(); 6 //问题2 子类的两个func和父类里的三个func函数是什么关系? 6 面试题4:是否可类的每个成员函数都声明为虚函数,为什么。 c++编译器多态实现原理 6 面试题5:构造函数中调用虚函数能实现多态吗?为什么? c++编译器多态实现原理 6 面试题6:虚函数表指针(VPTR)被编译器初始化的过程,你是如何理解的? 6 面试题7:父类的构造函数中调用虚函数,能发生多态吗? c++编译器多态实现原理 6 面试题8:为什么要定义虚析构函数? 6 其他 6 4.3多态原理探究 6 4.3.1 多态的实现原理 6 4.3.2如何证明vptr指针的存在 6 4.3.3构造函数中能调用虚函数,实现多态吗 6 5、纯虚函数和抽象类 6 5.1基本概念 6 5.2抽象类案例 6 5.3抽象类在多继承中的应用 6 5.3.1有关多继承的说明 6 5.3.2多继承的应用场景 6 5.4抽象类知识点强化 6 5.5面向抽象类编程思想强化 6 5.4.1案例:socket库c++模型设计和实现 6 5.4.2案例:计算员工工资 6 5.4.3案例:计算几何体的表面积和体积 6 5.6 C面向接口编程和C多态 6 5.6.1函数类型语法基础 6 5.6.2函数指针做函数参数 6 5.6.3函数指针正向调用 6 5.6.4函数指针反向调用 6 5.6.5.C动态库升级成框架案例 6 5.6.6附录:诸葛亮的锦囊妙计 6
面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
引用\[1\]中提到,默认构造函数是一种特殊的成员函数。如果在类中没有声明任何构造函数,编译器将提供隐式的inline默认构造函数默认构造函数可以在创建对象时自动调用,用于初始化对象的成员变量。在引用\[2\]中,给出了默认构造函数的几种语法形式,包括类内成员初始化器、类定义之外的默认构造函数的定义、弃置的默认构造函数和预置的默认构造函数。类内成员初始化器可以在类定义中直接初始化成员变量,类定义之外的默认构造函数的定义可以在类外部定义默认构造函数的具体实现。弃置的默认构造函数是指通过delete关键字将默认构造函数标记为被弃置,这样在使用时会导致编译错误。预置的默认构造函数是指即便其他构造函数存在,在某些情况下编译器会定义的隐式默认构造函数。在引用\[3\]中提到,引用和const成员必须被初始化,因此一个包含这些成员的类不能有默认构造函数,除非程序员提供了类内成员初始化器或者定义了一个默认构造函数来初始化它们。总之,默认构造函数C++类中起到初始化对象成员变量的作用,可以通过不同的语法形式来定义和使用。 #### 引用[.reference_title] - *1* *2* *3* [C/C++编程默认构造函数](https://blog.csdn.net/zhizhengguan/article/details/114990126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值