一、hello world 打印
1.1.C语言版本
#include<stdio.h>
int main(){
printf("hello world");
return 0;
}
1.2.C++版本
#include<iostream>
using namespace std;
int main() {
cout << "hello world!" << endl;
return 0;
}

二、命名空间冲突
2.1.命名空间的定义
需要使用namespace关键字,后面跟命名空间的名字,再加上一对{},{}中即为命名空间的成员,命名空间中可以定义函数、变量、类型等。
namespace本质是定义出一个域,与全局域独立。
C/C++中,主要有全局域、局部域、命名空间域和类域,命名空间域和类域不影响变量的生命周期。
#include<iostream>
//using namespace std;
//int main() {
// cout << "hello world!" << endl;
// return 0;
//}
int main() {
/*cout << "a" << endl;*/
int a = 1;
int a = 10;
printf("%d", a);
return 0;
}

2.2."就近原则"与遮蔽效应
当内外层作用域存在同名变量时,编译器会优先使用当前层级(最近)的变量,从而暂时"屏蔽"掉外层的同名变量。

三、命名空间定义变量、函数、类型
#include<iostream>
namespace sk {
int a = 1;
int add(int c, int b) {
return c+ b;
}
struct k {
int val;
struct k* next;
};
}
int a = 9;
int main() {
printf("%p\n",a);
printf("%d\n",sk:: a);
return 0;
}

四、命名空间的使用
4.1.命名空间可以嵌套使用
namespace sk {
int a = 1;
int add(int c, int b) {
return c+ b;
}
struct k {
int val;
struct k* next;
};
//命名空间嵌套使用
namespace ok {
int q = 6;
int sub(int d, int e) {
return d - e;
}
}
}

4.2.使用命名空间定义的函数、变量有三种方式
a.指定命名空间访问
b.using将命名空间中的某个成员展开
c.展开命名空间中的全部成员
4.3.未声明的标识符
namespace bc{
int a = 1;
int b = 2;
}
int main() {
printf("%d\n", a);
return 0;
}
4.4.多文件中可以定义同名namespace它默认会合并在一起就如同是一个namespace一样


五、C++的输入与输出
5.1.<iostream>
<iostream>是input output stream的缩写,是标准的输入输出流库,定义了标准的输入输出对象。
5.2.std::cin
std::cin是标准输入流,主要面向窄字符的标准输入流。
5.3.std::cout
std::cout是标准输出流,主要面向窄字符的标准输出流。
5.4.std::endl
std::endl是一个函数,流插入输出时,相当于插入一个换行字符和刷新缓冲区的作用。



六、缺省参数
6.1.缺省参数的定义
缺省参数是函数声明和定义时为函数的参数指定一个缺省值,在函数调用过程中,如果没有指定实参九使用形参的缺省值。缺省函数分为全缺省和半缺省。

6.2.全缺省
全缺省就是全部形参给缺省值。

6.3.半缺省
半缺省就是部分形参给缺省值。C++规定的半缺省值必须从右到左依次连续缺省,不能跳跃间断。
带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃间断。

七、函数重载
7.1.定义
C语言中函数在同一作用域中不支持同名使用,C++支持在同一作用域中出现同名函数,可以是参数个数或者类型或类型顺序不同,使用起来更加灵活
7.2.使用
a.参数类型不同

b.参数个数不同

c.参数类型顺序不同

八、引用
8.1.引用的概念和定义
引用就如同现实生活中的给别人取外号一样,同理,在C++中,给已存在的一个变量取别名,这称为引用,编译器不会为引用单独开辟空间。
定义:类型&引用别名=引用对象;

8.2.引用的特性
a.定义时初始化

b.一个变量可以有多个引用

c.一旦引用一个实体,就不能引用其他实体

8.3.引用在实际中的应用
(引用传参和引用做返回值)实践中主要引用传参和引用作返回,减少拷贝提高效率和改变引用对象时同时改变被引用对象

代码如下:可自行测试
#include<iostream>
using namespace std;
void swap(int& a, int& b) {
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main() {
int x=20,y=90;
cout << x << " " << y << endl;
swap(x, y);
cout << x<< " " << y<< endl;
return 0;
}
九、const引用
9.1.const引用的定义
在 C++ 中,const 引用(常量引用)是指不允许通过该引用修改其所绑定对象的引用。它的核心语法是在类型前加上 const 修饰符。
9.2.使用
引用const对象,要用const引用。const引用可以引用普通对象,引用权限可以缩小,但不能放大



代码如下:可以自行测试
#include<iostream>
using namespace std;
int main() {
const int x = 20;//只读不写
//int& a = x;//这里可写,报错原因:权限放大了
const int& a = x;
int y = 30;
const int& b = y;//只能看,不能改
cout << x << " " << a << endl;
cout << y << " " << b << endl;
return 0;
}
十、指针和引用的关系
10.1.引用不开空间,指针是地址,需要开空间。
10.2.引用需要初始化,指针建议初始化。
10.3.引用在初始化一个对象后,不能再引用其他对象,指针可以改变指向。
10.4.引用可以直接访问指向对象,指针需要初始化。
十一、inline
11.1.内联函数的定义
用inline修饰的函数称为内联函数,如swap函数。
11.2.使用
适用于频繁调用的短小函数(5-10)行,不适用于代码相对多的函数,因为加上inline也会背编译器省略。

代码如下:可以自行测试
#include<iostream>
using namespace std;
inline int add(int x, int y) {
return x + y;
}
int main() {
int x = 10;
int y = 20;
cout << x << " " << y<< endl;
return 0;
}
十二、nullptr
12.1.定义
nullptr是一个特殊的关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型使用nullptr定义空指针可以避免类型转换的问题,因为nullptrl只能被隐式地转换为指针类型而不能转换为整数类型。

#include<iostream>
using namespace std;
void f(int x) {
cout << "f(int x)" << endl;
}
void f(void* x) {
cout << "f(void *x)" << endl;
}
int main() {
f(0);
return 0;
}
#include<iostream>
using namespace std;
void f(int x) {
cout << "f(int x)" << endl;
}
void f(void* x) {
cout << "f(void *x)" << endl;
}
int main() {
f(0);
f(NULL);
f(nullptr);
return 0;
}