C++入门基础总结(最详细)

时间:2024-10-12 08:34:19

目录

Ⅰ.命名

关键字与命名空间

1.命名空间里的内容

2.命名空间的嵌套

3.多种使用方式

4.多文件工程重名处理

Ⅱ.缺省参数

1.缺省参数概念

2.缺省参数分类

Ⅲ.函数重载

1.函数重载的概念

注意:下列情况不能重载!!

Ⅳ. 内联函数(Inline)

1.内联函数的概念

2.内联函数的特性与用法

Ⅴ. auto关键字(C++11)

的使用细则

的注意事项

3.基于范围的for循环(C++11)

4.范围 for 的使用注意事项

Ⅵ.指针空值 nullptr

引入 nullptr 的原因

Ⅶ.引用

1.引用概念

2.引用特性

3.引用的应用

4.常引用

权限的放大

权限的缩小

保持权限的一致

5.引用与指针的区别


Ⅰ.命名

关键字与命名空间

C++关键字:

众所周知,给变量或者函数命名时不能用关键字,但是如果非要用怎么办呢?

为了很好地解决这种冲突的问题,C++ 就加入了命名空间的特性!在 C++ 里,我们就可以利用 "命名空间" 来解决这个问题,所以 C++ 提出了一个新语法 —— 命名空间 namespace

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作 用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

1.命名空间里的内容

命名空间里的内容,不仅仅可以存放变量,还可以在里面放函数,结构体,甚至是 类

#include <>
 
namespace N1 {
	int a = 10;
	int b = 20;
	int Add(int x, int y) {
		return x + y;
	}
}
 
namespace N2 {
	int c = 0;
	struct Node {
		struct Node* next;
		int val;
	};
}
 
int main(void)
{
	int res = N1::Add(N1::a, N1::b);
	printf("result = %d", res);
 
	struct N2::Node node1;
 
	return 0;
}

2.命名空间的嵌套

#include<iostream>
namespace N2
{
	int a=10;
	int b=2;
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace N3
	{
		int c=3;
		int d=40;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

int main()
{
	int ret = N2::N3::Sub(N2::a, N2::N3::d);
	printf("%d", ret);    //-30
	return 0;
}

虽然套了这么多层,但是它们仍然都是全局的,只是套在了一个命名空间内而已

3.多种使用方式

方法一:空间名 + 作用域限定符 

namespace N {
    int a = 10;
}
 
int main()
{
    printf("%d\n", N::a);
 
    return 0;
}

方法二:使用 using namespace 命名空间名称引入 (会破坏隔离效果)

namespace N {
    int a = 10;
}
 
using namespace N;
 
int main()
{
    printf("%d\n", a);
 
    return 0;
}

也就是全展开,说白了就是约等于完全没用到namespace,跟直接定义在全局一样

方法三:使用 using 将命名空间中成员引入

namespace N {
    int a = 10;
}
 
using N::a;
 
int main()
{
    printf("%d\n", a);
 
    return 0;
}

最常见的用法

4.多文件工程重名处理

项目中定义的某个命名空间的名字和其他命名空间的名字冲突了怎么办?

C++规定,同一个工程中允许存在多个相同的命名空间,编译器最后会将它们合成到一起

Ⅱ.缺省参数

1.缺省参数概念

缺省参数是 声明或定义函数时 为函数的 参数指定一个默认值 。在调用该函数时,如果没有指定实参则采用该 默认值,否则使用指定的实参
void TestFunc(int a = 0) {
	cout << a << endl;
}
int main()
{
	TestFunc(); // 没有传参时,使用参数的默认值
	TestFunc(10); // 传参时,使用指定的实参
}

2.缺省参数分类

全缺省参数
void TestFunc(int a = 10, int b = 20, int c = 30) {
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
半缺省参数
void TestFunc(int a, int b = 10, int c = 20) {
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

注意:
1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现,如:
//
void TestFunc(int a = 10);
// 
void TestFunc(int a = 10)
{}
// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那
个缺省值。

3. 缺省值必须是常量或者全局变量
4. C 语言不支持(编译器不支持)

Ⅲ.函数重载

1.函数重载的概念

函数重载 : 是函数的一种特殊情况, C++ 允许在 同一作用域中 声明几个功能类似 的同名函数