C++基础入门指南

一,命名空间的定义和使用

namespace的本质上是定义出一个域,这个域和全局域相互独立。不同的域中可以定义相同的变量名,函数名,类型。

namespace 的结构是:namespace 名称{}

其中namespace命名空间可以进行嵌套多层

展示:

补充内容:

项目工程中可以定义多个同名的namespace不会造成冲突,会认为是一个命名空间

C++标准库都放在一个名为std的命名空间中

C++中的域有全局域,命名空间域,函数域,类域,域会影响编译时语法查找一个变量/函数/类型出处的逻辑,局部域和全局域还会影响变量的生命周期,命名空间域和类域不会影响变量的生命周期。


二,C++的输入和输出

<iostream>是标准的输入输出流库,定义了标准输入输出对象。

std::cin是istream类的对象,它主要面向对窄字符的标准输入流。

std:out是ostream类的对象,它主要面向对窄字符的标准输出流。

std:endl是一个函数,在流插入输出的时候,相当于一个换行符加刷新缓冲区。

<<是流插入操作符,>>是流提取操作符。

C++的输入和输出可以自动识别变量的类型,C++也能更好的支持自定义类型对象的输入和输出。

using namespace std 就相当于把命名空间创建出的高墙给拆了,可以直接使用命名空间中的对象。

代码展示:

cpp 复制代码
#include<iostream> //标准输入输出库 
//展开标准输入流std空间,方便使用cout函数,cin函数和endl函数
using namespace std;
namespace space
{
	namespace k1 //命名空间的嵌套
	{
		int p = 33;
	}
	namespace  k2
	{
		int n = 66;
	}
	double r1 = 5.2;
	const char* ch = "add";
	char arr[] = "wwSS";
}
using namespace space; //展开命名空间的全部
using namespace k1; //展开命名空间的嵌套命名空间

namespace area
{
	int a = 1;//不进行展开,指定命名空间进行访问
	int d = 2;
}
using area::d; //展开命名空间的部分成员
int main()
{
	
	cout << p << endl; //33
	cout << k2::n << endl;//66
	cout << r1 << endl;//5.2
	cout << ch << endl;//add
	cout << arr << endl;//wwSS
	cout << area::a << endl;//1
	cout << d << endl; //2
	cout << d << "\n";//2
	int d1 = 2;
	double d2 = 2.3;
	char d3 = 'c';
	cin >> d1;
	cin >> d2;
	cin >> d3;
	cout << d1 << endl;
	cout << d2 << " " << d3 << endl;
	return 0;
}

运行结果:

复制代码

三,缺省参数

1,缺省参数是在声明或定义函数时为函数的参数指定一个缺省值。在调用函数时如果不使用传入实参,就使用缺省参数代替实参,否则就使用实参,缺省参数分为全缺省和半缺省参数

2,全缺省就是函数的所有参数都有缺省值,半缺省就是函数的一些参数有缺省值,一些没有缺省值,规定对于半缺省一定要从右到左有缺省值,中间不能有跳过给实参。

3,调用带缺省参数的函数时,必须从左到右给实参,不能跳跃给实参。

4,缺省参数不能在函数的声明和定义中同时出现,规定函数声明给缺省值。

展示:


四,函数重载

C++中支持在同一作用域当中出现同名函数,但是要求这些同名函数的形参不同,要么参数类型不同,要么参数的数量不同,要么参数的类型的顺序不同。

展示:

cpp 复制代码
//1,参数的类型不同
void Func1(int x)
{
	cout << "Func1()" << endl;
}
void Func1(double a)
{
	cout << "Func1()" << endl;
}
//2,参数的个数
void Func2()
{
	cout << "Func2()" << endl;
}
void Func2(int y)
{
	cout << "Func2()" << endl;
}
//3,函数参数的顺序不同
void Func3(double x,int y)
{
	cout << "Func3()" << endl;
}
void Func3(int y, double x)
{
	cout << "Func3()" << endl;
}
int main()
{
	Func1(1);
	Func1(3.2);
	Func2();
	Func2(1);
	Func3(3.3, 12);
	Func3(1,3.2);
	return 0;
}

运行结果:

五,引用

1,引用的概念和定义

结构:类型& 引用别名 = 引用对象;

a b c d都是同一个

2,引用的特性

1,在进行引用前引用对象必须初始化

2,一个变量可以有多个引用

3,引用一旦引用一个实体,就不能再引用其他的实体

3,引用的使用

引用在实践中通常是用作函数引用传参和引用做返回值,减少拷贝(C语言传值和传址调用都会创建新的空间)提高效率,改变引用对象和被引用对象。

引用和指针的功能相辅相成,虽然有些重叠,但是互不可以替代,C++的引用不能改变指向,而指针可以。

展示:

4,const引用

const引用是指向常量对象的引用,引用后就不能再对被引用对象的值进行修改。相当于缩小了权限,只能用不能改

使用引用时要注意权限的问题,权限只能缩小,不能进行放大

例如:

常数和临时对象不能进行直接引用,需要const修饰,改变权限。

临时对象:编译器需要创建一个空间来存储表达式的求值结果时,所创建一个未命名的对象,这个未命名的对象就是临时对象。

5,指针和引用的关系

1,引用是一个变量取别名,不开辟额外的空间。指针存储的是一个变量的地址,需要开辟空间。

2,引用在使用时必须初始化,指针不一定需要初始化。

3,引用在初始化后就不能再引用其他的对象,而指针可以不断的更改指向的对象。

4,引用可以直接访问对象,而指针需要进行解引用才是访问的对象。

5,sizeof中含义不同,引用的是引用对象的类型的大小,指针则是地址空间所占的字节数(32位下为4个字节,64下为8个字节)。

指针很容易出现空指针和野指针的问题,而引用就很少出现, 相对安全。

六,inline

1,用inline修饰的函数叫做内联函数。调用内联函数可以让函数展开,不创建函数栈帧,就可以提高效率。

2,C语言在程序预处理阶段会替换展开,但是宏函数的实现很复杂,并且不能进行调试,所以C++就设计出内联函数来替代宏函数。

3,inline对编译器来说只是一个建议,编译器会根据情况选择展开或者不进行展开,inline适合调用短小的函数,当函数内容比较大的时候,就会被编译器忽略。

4,inline不建议声明和定义放到两个文件当中,分离会导致链接错误。

5,inline内联函数在debug版本下,是默认不进行展开的,为了方便进行调试。

使用只需要在函数返回值类型前面加上inline

七,nullptr

在C语言中(void*)可以自动转化为其他类型的指针,而在C++中就不可以。

C++中的NULL会被定义为0,在C中则会被定义为无类型的指针(void*),为了表示C++中的空指针,引入了nullptr,nullptr是一种特殊的关键字,可以自动转化为其他的指针类型,但是不能转化为整数类型。

相关推荐
计算机安禾2 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
qq_401700412 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
玖釉-3 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
XMYX-03 小时前
37 - Go env 环境变量:配置管理与运行时控制
开发语言·golang
一楼的猫3 小时前
从文本特征分析看网文平台AI检测:3个被忽视的指标
开发语言·人工智能·学习方法·ai编程·ai写作·ai自动写作
yuan199973 小时前
基于MATLAB的梁非线性动力学方程编程实现框架
开发语言·matlab
Xin_ye100863 小时前
C# 零基础到精通教程 - 第十一章:LINQ——语言集成查询
开发语言·c#
欧米欧3 小时前
C++进阶数据结构之搜索二叉树
开发语言·数据结构·c++
青小莫3 小时前
C++之vector讲解
c++·stl