C++:入门学习C++,它在C的基础上做了哪些修改?

2023-11-19

命名空间

首先看这样的代码:

#include <stdlib.h>
#include <stdio.h>

int rand = 0;

int main()
{
	printf("%d", rand);
	return 0;
}

上述代码可以编译通过吗?很明显是不可以的,原因在于头文件stdlib中包含了rand函数,因此在定义变量时就不可以再继续使用rand作为你的变量了

而在未来写工程项目中,这样的情况会遇见很多,在包含某个头文件后,代码中的许多变量就不可以再使用了,这就体现出了C语言的一部分局限性

那么C++在C语言的基础上很好的改善了这个问题,C++引入了命名空间的概念,把变量命名在某个空间内,这样就能很好的解决这个问题

命名空间的定义很自由,可以定义变量,定义函数,定义结构体,甚至可以嵌套定义

namespace zbh
{
	//定义变量
	int test = 0;

	//定义函数
	int Add(int x, int y)
	{
		return x + y;
	}

	//定义结构体
	struct MyStruct
	{
		int a;
		int b;
	};

	//命名空间可以嵌套
	namespace free
	{
		int print1()
		{
			return 1;
		}
	}
}

命名空间是如何使用的?C++如何保证命名空间的独立性?

  1. 使用变量时单独说明
  2. 前面定义使用命名空间中的某个函数或变量等
  3. 直接展开
#include <stdio.h>

namespace zbh
{
	//定义变量
	int test = 0;

	//定义函数
	int Add(int x, int y)
	{
		return x + y;
	}

	//定义结构体
	struct MyStruct
	{
		int a;
		int b;
	};

	//命名空间可以嵌套
	namespace free
	{
		int print1()
		{
			return 1;
		}
	}
}

using zbh::Add;

int main()
{
	printf("%d\n", zbh::test);
	printf("%d\n", Add(1,2));
	printf("%d", zbh::free::print1());
}

上面对命名空间的定义也可以省略,直接在main函数前加上

using namespace zbh;

即可直接在后面的函数中使用,通过这样的方式即实现了函数命名空间的独立化

缺省参数

C++中对于函数参数定义了缺省参数,可以理解为,如果我对函数参数中的成员赋给了它一个初值,那么在后续调用的过程中,如果我并未给函数传参,那么函数就会使用默认的参数

具体样例如下所示

#include <iostream>
using namespace std;

void f(int a = 10, int b = 20, int c = 30)
{
	cout << a << " " << b << " " << c << endl;
}

int main()
{
	f();
	f(1);
	f(1, 2);
	f(1, 2, 3);
	return 0;
}

运行结果如下:
在这里插入图片描述
在实际中这样的操作有什么作用??

在定义顺序表中,我们使用的是动态开辟的顺序表,那么在初始化阶段我们是不是可以利用缺省参数优化一些步骤?

首先看C语言实现过程中的方法

#include <stdio.h>
#include <stdlib.h>

typedef int SLDataType;
typedef struct Seqlist
{
	SLDataType* a;
	int size;
	int capacity;
};

void SeqlistInit(Seqlist* s)
{
	s->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
	s->size = 0;
	s->capacity = 4;
}

这样的实现实际上把容量写死了,不管要开辟多大的顺序表我们都是先开辟容量为4的顺序表再后续进行扩容,而扩容用的realloc是有消耗的

但假设如果我们使用缺省参数进行实现这个函数,可以优化很多

#include <iostream>
using namespace std;

typedef int SLDataType;
typedef struct Seqlist
{
	SLDataType* a;
	int size;
	int capacity;
}Seqlist;

void SeqlistInit(Seqlist* s,int capacity=4)
{
	s->a = (SLDataType*)malloc(sizeof(SLDataType) * capacity);
	s->size = 0;
	s->capacity = capacity;
}

int main()
{
	Seqlist sq,sl;
	SeqlistInit(&sl);
	SeqlistInit(&sq, 100);
	return 0;
}

调用监视观察可以看到

在这里插入图片描述
利用缺省参数,我们确实实实在在实现了自由确定自己想要的容量

函数重载

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

下面展示了什么是函数重载

#include <iostream>
using namespace std;

void func(int a, double b)
{
	cout << "void func(int a, double b)" << endl;
}

void func(double b, int a)
{
	cout << "void func(double b, int a)" << endl;
}

int main()
{
	func(1, 1.1);
	func(2.2, 2);
	return 0;
}

当同名函数中参数个数或参数类型不同时,构成了函数重载,编译器会自动识别传参的个数和类型对应不同的函数重载类型

那为什么C++支持,但是C语言不支持呢?

这里需要讲到一个程序运行起来需要经历的过程

预处理,编译,汇编,链接

假设现在定义了一个Add函数,这个Add函数是在a.cpp文件中定义的,而我要在b.cpp中使用这个函数,当使用后运行程序时,编译器要在b.cpp中使用该函数,但是却找不到这个函数的地址,因此编译器会去b.cpp的符号表中去寻找
Add的地址,然后把这两个链接在一起

在链接的过程中,C和C++就产生了不一样的地方,每个编译器都有自己专属的函数名修饰的规则

下面展示的是C语言编译器的展示结果:
在这里插入图片描述
从中可以看出,在编译完成后,函数名字的修饰依旧是函数的名字,没有实质性的变化

下面再看C++编译器中的样例

在这里插入图片描述
对比C语言的编译器可以很清楚的看到,C++的编译器在编译的过程中把函数名进行了一定程度的修饰,在Linux的编译器下是把函数的参数类型和参数个数也加到了函数名字当中

因此,从中就知道了,为什么C语言不支持函数重载,而C++支持了,就是因为C语言编译器对函数名就是函数名,而C++的编译器对函数名做了参数的引入进行修饰,因此重载后的函数有不同的函数名

从中也就能很轻松的理解,为什么函数参数的类型和个数一样,只有返回值不一样的时候,无法构成函数重载,就是因为编译器对于两个同名的函数不知道该调用哪一个

引用

C++在C的基础上做出的另一大调整就是引用

简单来说,引用就是给变量起了一个别名,变量本身和引用一起控制变量所在的区域

有下面的代码:

void test2()
{
	int a = 10;
	int& b = a;
	cout << &a << endl;
	cout << &b << endl;
}

那么这个程序的运行结果是多少呢

在这里插入图片描述
从中可以看出,引用并不是单独再开辟一块空间用来管理所指向的对象,而是直接和原来的变量一起控制某块区域内的内容

引用的一些特性

  1. 引用在定义的时候必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦确认了一个实体,就不能引用其他内容了

引用作为函数返回值

引用作为函数返回值是一件危险的事,但如果使用正确是有高回报的

我们以下面的操作为例

int& Count()
{
	int n = 1;
	n++;
	return n;
}

void test2()
{
	int a = 10;
}

int main()
{
	int& ret = Count();
	cout << ret << endl;
	test2();
	cout << ret << endl;
	return 0;
}

输出结果为2和10,这是为什么?

原因上升到了函数栈帧的问题,首先画出函数栈帧

下面画出的是main函数执行前两行时候的操作,后续还未画出

在这里插入图片描述
这里定义了&ret,它接收了来自Count函数中的返回值int& n,实际上,这里的ret已经具有了管理n那块区域的能力,而我们又知道,函数在结束后栈帧会被销毁,这里的销毁只是失去了对内存中这片区域的管理权,内存中这块区域本身还是存在的

因此,当下面执行test2函数时,又会开辟一块新的栈帧,而这块栈帧所在的位置和Count函数的栈帧是有很大重合区域的

在这里插入图片描述
因此,这里的ret已经具备了管理不属于它的空间的能力,它可以随时访问一块已经不属于它的区域,因此这里原本是n的空间,现在已经变成了a,但是它依旧可以访问,因此访问出的结果就是10了

因此,这里有需要注意的地方:

==如果函数返回时,出了函数的作用域,如果返回对象还在(没有还给系统),那么这里就可以使用引用返回,如果是像这样的临时变量或者局部变量,就必须使用传值返回

那么说回来,既然引用作为返回值或者参数如此危险,那它有什么使用的必要?

引用的收益

以函数传参为例,如果不用传引用会在函数传参的时候构建一个形参,如果传递的是对象,那么会执行很多默认的成员函数,这也是性能上的损耗,而如果传递的是引用,直接把已经创建好的对象引用到这里,略去了形参创建再销毁这个过程

传引用传参的优势

  1. 提高效率
  2. 输出型参数(形参的改变可以影响实参,类似于指针,但比指针简单一些)

继续谈作为引用返回的优势,作为引用返回也是诸多好处,当然是使用正确的前提;有这样的原则,什么时候可以使用传引用返回?结论是当返回的内容出了函数作用域不被销毁就可以,这是有相当高收益的,在类内的很多成员函数中,返回的通常是*this,而this并不会被销毁,这时用传引用的返回值就很值得

传引用返回的优势

  1. 提高效率
  2. 可以修改返回对象

综上所述, 传值传参还是传值返回值都会创建对象,而使用引用就避免了无效的,多余的创建带来的性能损耗

引用和指针的区别?

语法概念来讲引用是别名,没有自己的空间,它存在的本身就是和实体公用一块空间

但是
底层实现上引用是有自己的空间的,引用本身就是用指针的方式实现的

引用和指针的对比

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

内联函数

首先,什么是内联函数?

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。

我们都知道,当main函数执行到某个函数时,会在内存中建立该函数的栈帧,再call(调用),而建立函数栈帧是有成本的,如果频繁的建立一些可能只有很少语句的函数会浪费程序运行的效率,因此内联函数的产生就解决了这个问题

内联函数工作的原理,就是在编译阶段,直接把函数体替换为函数调用,从汇编中可以看出,正常函数是有函数调用和函数栈帧的创建的,而内联函数直接把函数体全部都放到汇编

现在我们有这样的代码:

int add(int a, int b)
{
	return a + b;
}

int main()
{
	int a = 1;
	int b = 2;
	int c = add(a, b);
}

通过汇编来观察

在这里插入图片描述
当执行到add函数时,确确实实是调用了add函数,那么假如把add函数设为内联函数

inline int add(int a, int b)
{
	return a + b;
}

int main()
{
	int a = 1;
	int b = 2;
	int c = add(a, b);
}

再来看它的汇编代码,就会发现不再是函数调用,而是直接把函数体展开

在这里插入图片描述

内联函数的特性

这么来看,内联函数确实是很有用,但内联函数有它不可忽视的弊端

内联函数是一种用空间换时间的方法,不可否认,在这里略去了函数建立栈帧所需要的时间消耗,但是在编译阶段,内联函数会把函数调用全部替换为函数体,这会使得目标文件变大

因此,内联函数只是一个建议,只是建议编译器可以把这个函数当成内联函数来处理,但是具体到底有没有把它当成内联函数来处理还要看编译器本身,一般来说,会把函数规模比较小,不是递归函数,调用很频繁的函数设置为内联函数

同时,内联函数不应该声明和定义分离,内联函数被展开后,函数地址也就不复存在了,链接过程中就无法找到链接

内联函数和宏的关系

在C语言中,引入了宏,宏看似是一个很好的功能,但其中也有很多弊端

宏的优缺点?

优点:

  1. 增强代码的复用性。
  2. 提高性能。

缺点:

  1. 不方便调试宏。(因为预编译阶段进行了替换)
  2. 导致代码可读性差,可维护性差,容易误用。
  3. 没有类型安全的检查 。

因此,内联函数的出现也算是弥补了宏定义函数带来的诸多不便

指针空值问题

在良好的编程习惯中,定义一个变量要给它一定的初始值,因此在C语言中,我们定义一个指针时,对它的初始化常常是NULL

NULL实际上是一个宏

#define NULL  0

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	f(0);
	f(NULL);
	f((int*)NULL);
	return 0;
}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。

因此,在C++的新标准中就引入了关于空指针:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:入门学习C++,它在C的基础上做了哪些修改? 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • MYSQL中索引与主键的区别

    MYSQL中索引与主键的区别 索引 索引好比是一本书的目录 可以快速的通过页码找到你需要的那一页 惟一地标识一行 主键 做为数据库表唯一行标识 作为一个可以被外键有效引用的对象 索引是一种特殊的文件 InnoDB数据表上的索引是表空间的一个
  • Unity中的重载和重写

    Unity中的重载和重写 一 重载 二 重写 三 重载和重写的区别 一 重载 重载 两个必须一个可以 参数名必须相同 参数列表必须不同 返回值类型可以不同 代码示例 using System Collections using System
  • Linux 磁盘命令工具 比df更好用

    对于分析磁盘使用情况 有两个非常好用的命令 du 和 df 简单来说 这两个命令的作用是这样的 du 命令 它是英文单词 disk usage 的简写 主要用于查看文件与目录占用多少磁盘空间 df 命令 它是英文单词 disk free 的
  • python爬取证券之星网站

    周末无聊 找点乐子 coding utf 8 import requests from bs4 import BeautifulSoup import random import time 抓取所需内容 user agent Mozilla
  • 安卓逆向学习-Crack01 学习记录

    Crack01 学习记录 要感谢京峰教育 资料下载 https download csdn net download m0 47210241 85053839 利用jadx gui打开 分析代码 package com zhy editVi
  • nodejs封装api

    安装了nodeJs 执行 安装淘宝镜像 npm install g cnpm registry https registry npm taobao org 安装 yarn 我使用这个 淘宝镜像总是莫名其妙各种bug npm install
  • aix安装 php,CNESA

    aix安装samba服务器可以使用两种方式安装 一种是使用rpm包进行安装 一种是使用源码编译安装 一 使用samba的rpm包进行安装 1 下载samba的rpm包 下载地址为http www bullfreeware com searc
  • C++笔记--线程间共享数据

    当线程在访问共享数据的时候 必须制定一些规矩 用来限定线程可访问的数据位 还有 一个线程更新了共享数据 需要对其他线程进行通知 从易用性的角度 同一进程中的多个线程进行数据共享 错误的共享数据使用是产生并发bug的一个主要原因 当涉及到共享
  • 为什么训练集用fit_transform()而测试集用transform()及sklearn.feature_extraction.text.CountVectorizer API详解

    真正讲明白的 https blog csdn net yyhhlancelot article details 85097656 API https scikit learn org stable modules generated skl
  • mysql+mybatis 批量插入与批量更新

    首先批量更新需要增加 数据库的链接必须加上但是数据库连接必须加上 allowMultiQueries true 属性 不然会报错 You have an error in your SQL syntax check the manual t
  • 各种源码下载地址(目前只有ffmpeg和nginx,libcurl,RapidJSON 文档)

    各种源码下载地址 目前只有ffmpeg和nginx libcurl RapidJSON 文档 ffmpeg源码下载地址 http ffmpeg org download html releases nginx源码下载地址 http hg n
  • H5监听移动端物理/浏览器返回键

    JavaScript没有监听物理返回键的API 所以只能使用 popstate 事件监听 工具类如下 export function handleBrowserGoBack back console log back pushHistory
  • 论文阅读——基于深度学习智能垃圾分类

    B Fu S Li J Wei Q Li Q Wang and J Tu A Novel Intelligent Garbage Classification System Based on Deep Learning and an Emb
  • su命令切换用户输入密码后,提示:鉴定故障

    在终端通过su命令切换用户输入密码后 提示 鉴定故障 这是因为在安装linux系统时未设置root用户密码造成的 需要重新设置密码后再切换用户 具体操作命令如下 设置root用户密码 sudo passwd root 切换用户 su
  • 三步搞定ABAP DOI操作EXCEL

    ABAP可以使用OLE与DOI两种方式实现操作EXCEL 使用OLE时 每个单元格的值和样式都需要写代码实现 特别是对于不规则的格式 代码量巨大 而DOI是从服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存 当然 也可以直接
  • springboot中的kafka的KafkaTemplate的配置类

    package com lf report utils import org apache kafka clients producer ProducerConfig import org apache kafka common seria
  • opencv 智能答卷识别系统(一)

    目标 这里是2 智能答卷之别系统二 识别答卷答案 识别准号证号码 识别姓名 识别试卷类别 试卷是有标记的 如试卷上方的黑框 排序结构 使用c 的标准排序算法 struct Ruley bool operator const Rect a1
  • 华为OD机试真题-座位调整-2023年OD统一考试(B卷)

    题目描述 疫情期间课堂的座位进行了特殊的调整 不能出现两个同学紧挨着 必须隔至少一个空位 给你一个整数数组 desk表示当前座位的占座情况 由若干 0 和 1 组成 其中 0 表示没有占位 1 表示占位 在不改变原有座位秩序情况下 还能安排
  • C#获取当前路径 -- 7种方法

    目录 一 代码 二 路径区别 三 参考文献 一 代码 推荐使用第3种 internal static class Program static void Main 获取模块的完整路径 string path1 System Diagnost
  • C++:入门学习C++,它在C的基础上做了哪些修改?

    文章目录 命名空间 缺省参数 函数重载 引用 引用作为函数返回值 引用的收益 引用和指针的区别 引用和指针的对比 内联函数 内联函数的特性 内联函数和宏的关系 指针空值问题 命名空间 首先看这样的代码 include