C++参考文档
Reference - C++ Reference
C++ 参考手册 - cppreference.com
cppreference.com
第一个C++程序
#include<stdio.h>
int main() {
printf("Hello C++\n");
return 0;
}
由上述代码可知C++是兼容C语言
第一个C++标准程序
#include<iostream>
using namespace std;
int main() {
cout << "Helloc C++" << endl;
return 0;
}
namespace命名空间
价值存在
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。 c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决 这样的问题
eg:我们知道rand是stdlib.h库中的一个函数,现在我们把他作为变量名。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main() {
printf("%d",rand);
return 0;
}
运行结果发现出现错误
这时我们用namespace,把该变量隔离就可以完美解决
namespaces定义
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
namespace只能定义在全局,当然他还可以嵌套定义。
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫std(standard)的命名空间中。
但打印结果并不是我们想要的,也就是打印的rand打印的就是stdlib.h中的rand,我们换成打印地址。
验证结果就是一个地址,也就是存在stdlib.h中的地址
那么我们如何访问rand=10 10这个变量呢?
首先介绍一个操作符::
::域作用限定符
::默认去全局查找变量
std::默认去std域中去查找
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace std {
int rand = 10;
}
int main() {
printf("%p\n",rand);
printf("%d", std::rand);
return 0;
}
完美解决。
namespace嵌套使用
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace std {
namespace a1 {
int Add(int x, int y) {
return x + y;
}
}
namespace a2 {
int Add(int x, int y) {
return (x + y) * 10;
}
}
}
int main() {
printf("%d\n", std::a1::Add(2,2));
printf("%d\n", std::a2::Add(2,2));
return 0;
}
运行结果
通过这个代码可以更让我们知道namespace存在的价值,假设在工作多人开发一个项目,写的函数相似,但函数返回值不同,那么就可可以用这种话隔离的方式,分别调用。
C++标准库都放在⼀个叫std(standard)的命名空间中。
命名空间使用
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
1.指定命名空间访问,项⽬中推荐这种⽅式。
就是我们上述写的在每次使用加上 名字::变量
2.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。\
using lph::a
3.展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
usinng展开直接使用:
不用using
用using
using namespace std:也就是把c++标准库中的函数全部展开。
C++输⼊&输出
• <iostream>是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。
• std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输 ⼊流。 • std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
• std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区
• <<是插入,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
• IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,后⾯我会有专⻔的⼀个章节来细节IO流库。
• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。
• ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。 • 这⾥我们没有包含,也可以使⽤printf和scanf,在包含间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。
缺省参数
• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)
如下如图所示10就是缺省值,第一个函数调用空参,使用缺省值,第二个函数调用,使用实参。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//确省参数
void Fun(int a=10) {
cout << a << endl;
}
int main() {
Fun();
Fun(20);
return 0;
}
• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
半缺省:
void Fun(int a, int b = 10, int c = 30) {
cout << a << " " << b << " " << c << endl;
}
int main() {
Fun(1);
Fun(1, 2);
Fun(1,2, 3);
return 0;
}
全缺省:
void Fun(int a=5, int b = 10, int c = 30) {
cout << a << " " << b << " " << c << endl;
}
int main() {
Fun();
Fun(1);
Fun(1, 2);
Fun(1,2, 3);
return 0;
}
• 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。
函数重载
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同(个数不同i或则类型不同)。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的,不同类型返回值不构成函数重载。
eg:
参数类型不同
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//参数类型不同
void Add(int a, int b) {
cout << "Add(int a, int b)" << endl;
}
void Add(double a, double b) {
cout << "Add(double a, double b)" << endl;
}
int main() {
//整形
Add(1,1);
//double型
Add(1.1,1.2);
return 0;
}
参数个数不同,调用函数也不同
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//参数类型不同
void Add() {
cout << "Add()" << endl;
}
void Add(int a) {
cout << "Add(int a)" << endl;
}
void Add(int a, int b) {
cout << "Add(int a, int b)" << endl;
}
int main() {
Add();
Add(1);
Add(1,2);
return 0;
}
入门2:CSDN