⭐从本章开始学习c++,此篇文章作为c++专栏的第一篇文章。
⭐本人c++代码的Gitee仓库:c++学习 · 橘子真甜/yzc的c++学习 - 码云 - 开源中国 (gitee.com)
目录
一.编程过程
和C语言类似:c++代码编译过程也分为:预编译,编译,汇编,链接。
预编译:头文件展开,宏替换,去掉注释,条件编译。
编译:检测语法,生成汇编代码。
汇编:将汇编代码转化为可执行的二进制机器指令
链接:将多个可执行文件链接起来,并且生成可执行文件
二.命名空间(namespace)
2.1 为何要用命名空间
在我们使用c/c++进行编程的时候,会存在大量的变量,函数,类,结构体。它们的名称都会存在全局区域中,很多时候我们会用相同的名称表示两个不同的东西。这样一来就会导致命名冲突。
使用命名空间就是为了对标识符的名称本地化,以避免命名冲突或名字污染。namespace就是为了解决这种问题的关键字
运行下例代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int fmax = 10;
int main()
{
printf("%d\n", fmax);
return 0;
}
运行结果:
报错显示:fmax重定义。所以我们必须使用namespace进行管理。
2.2 命名空间的定义
使用namespace关键字+名称+{}即可定义命名空间,{}中成员即为该命名空间的成员。
举例:
1.普通命名空间
//定义自己的命名空间
namespace YZC
{
//定义变量
int fmax = 10;
int a = 100;
//定义函数
void swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
//定义结构体
typedef struct Node
{
int val;
Node* next;
}Node;
}
2. 嵌套定义命名空间
namespace Yzc
{
namespace YZc
{
int a = 1;
}
}
3. 如果我们在同一个工程中的不同地方定义了命名空间,编译器会自动合并这些命名空间
//两个YZC会自动合并
namespace YZC
{
int a = 100;
}
namespace YZC
{
int b = 1;
}
2.3 使用命名空间
1. 命名空间名称+作用域限定符
int main()
{
cout << YZC::fmax;
return 0;
}
2. 使用using 将命名空间中的变量引入
using YZC::a;
int main()
{
cout << a << endl;
return 0;
}
3. using namepace 命名空间 引入这一整个命名空间
using namespace YZC;
int main()
{
cout << a << endl;
int b = 1;
swap(a, b);
return 0;
}
三. C++输入输出
3.1 cout,cin
在C语言中,我们使用scanf和printf进行输入输出,这两个函数比较麻烦。
而在C++中,我们使用更方便使用的cout和cin进行输入输出。
说明:
1.使用cout标准输出对象(控制台,屏幕),使用cin标准输入对象(键盘)需要包含头文件<iostream>
2.若不使用c++标准命名空间std的话,需要 std::cin std::cout,这样才能使用
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b;
cout << "请输入b的值:";
cin >> b;
cout << "a:" << a << " b:" << b << endl;
return 0;
}
运行结果:
注:
1. endl是c++中一共特殊的符号,表示换行。c++也能使用 "\n"表示换行
2. cout,cin 会自动识别变量的类型进行输入输出,无需像printf和sacnf那样需要我们进行控制
3.2 std使用惯例
如何更合理的使用 std标准库的命名空间?
1. 日常使用,建议直接使用 using namespace std 展开std,方便我们学习和使用c++
2. 在工程中,不建议展开std,而是 std:: 名称 来使用std中的成员。这是由于我们可能会定义和std中一样的变量,函数,类 等。防止冲突
四. 缺省参数
缺省参数是在我们定义函数的时候,函数的参数可以给一个默认值。当我们调用该函数的时候,如果没有传入参数,就会使用这个默认值作为参数
#include<iostream>
using namespace std;
void test1(int a = 0)
{
cout << a << endl;
}
int main()
{
test1();
test1(2);
return 0;
}
缺省参数有全缺省和半缺省两种
#include<iostream>
using namespace std;
//半缺省
void fun1(int a, int b = 1)
{
cout << a + b << endl;
}
//全缺省
void fun2(int a = 0, int b = 1)
{
cout << a + b << endl;
}
int main()
{
fun1(2);
fun2();
return 0;
}
注:
1. 半缺省参数必须从右向左依次给,不能间隔
2. 缺省参数不能在函数定义和声明中同时出现,这样会导致重定义
void test(int a = 0);
void test(int a = 1)
{}
3. 缺省值必须是常量或者全局变量
4. C语言不支持缺省参数