原因
首先明确一点,为什么要有cpp,cpp是cplusplus,是用来解决C语言的缺陷的,那么就可以明确一点就是成员是可以在cpp之中用的
所以以下皆是不同
namespace
原因:
C语言之中的所有的名字都储存在一个地方,那么就是可以确定一点就是名字不可以重复,那么在大型多人合作是就会出现大量的命名冲突。
定义:
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
本质:
namespace本质是开辟一个和全局例外的领域,之后就是在不同封装的不同地点,在找到时候直接到相应的地方找。
特点:
namespace只能定义在全局,当然他还可以嵌套定义。
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫std(standard)的命名空间中。
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。
{}后面不用加;
使用
指定命名空间访问,项⽬中推荐这种⽅式。
using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
输⼊&输出
头文件
<iostream>是Input Output Stream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。
类型
std::cin是istream类的对象,它主要⾯向窄字符的标准输 ⼊流。约等于scanf
std::cout是ostream类的对象,它主要⾯向窄字符的标准输出流。printf
std::endl是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。\n
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
⼀般⽇常练习中我们可以usingnamespacestd,实际项⽬开发中不建议using namespace std
缺省参数
缺省参数是声明或者定义参数时候给一个缺省值,调用时,没有是擦,直接默认参数
可以全给,可以给部分,但是可以以此缺省,不可以跳跃给
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。(为了避免给的不一样)
函数重载
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。
引⽤
定义
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名
编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。
典型:你妻子的名字=老婆=爱人
格式
类型&引⽤别名=引⽤对象;
特性
引⽤在定义时必须初始化:必须要有一个指向,没有老婆就不要说爱人
⼀个变量可以有多个引⽤:典型:你妻子的名字=老婆=爱人
引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体。典型:你妻子的名字=老婆=爱人
使⽤
目的
为了引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。
void Swap(int& rx, int& ry)
{
int tmp = rx;
rx = ry;
ry = tmp;
}
int main()
{
int x = 0, y = 1;
cout << x <<" " << y << endl;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}
典型:你的朋友a给你另外一个朋友b的一个新取的外号c说c出事了,也就是b出事了
减少应用空间,也就是寄存器之类的,详细参考另外一篇博客
int& STTop(ST& rs)
{
assert(rs.top > 0);
return rs.a[rs.top];
}
int main()
{
STTop(st1) += 10;
cout << STTop(st1) << endl;
return 0;
}
这个代码通过不了,应为函数的返回值具有常性
返回值都是零食对象,之后都会销毁
引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些
const应用
const引用可以引用const对象还有普通对象
普通引用不可以引用const对象
const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
int& ra = a
改成
const int& ra = a;
而且之后不可以更改
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20;
const int& rb = b;
nullptr
NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被 隐式地转换为指针类型,⽽不能被转换为整数类型。
#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);
// 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int
x),因此与程序的初衷相悖。
f(NULL);
f((int*)NULL);
// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
// f((void*)NULL);
f(nullptr);
return 0;
}
inline
⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。
主要是为了功能上=宏
是属于频繁 调⽤的短⼩函数
inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。