系列文章目录
c++基础知识1
1 c++基础知识合集
1.1命名空间:关键字 namespace N
记忆:c++库中所有东西都在std命名空间中
使用前 ‘using namespace std;’
作用:不同命名空间中可以出现重复的命名
namespace N1
{
int a;
int add(int left ,int right)
{
retrun left+right;
}
}
namespace N2
{
int a;
int add(int left ,int right)
{
retrun left+right;
}
}
1.1 命名空间成员的使用:
1.作用域限定符: N1(空间名称)::a(变量名称或函数名称)
int main()
{
printf("%d",N::a);
printf("%d",N::add(1,2));
return 0;
}
2.使用using展开空间中某个变量或函数 using N1::a
{
using N1::a
int main()
{
printf("%d",a);
return 0;
}
}
3.使用using展开全部空间 using namespece N1;
using namespce N;
int main
{
printf("%d",a);
printf("%d",b);
Add(10,20);
return 0;
}
1.2 C++输入和输出
int main()
{
char c;
cin>>c;//输入
cout<<"hello world"<<endl;//输出,其中endl表示换行
return 0;
}
1.3 缺省函数,缺省部分必须放在最后面
1.4函数重载
重载底层:c++编译为函数名+参数类型 c编译为函数名
int Add(int a,int b) //c++ ,编译为 _Z3Addii c编译为Add
{
return a+b;
}
double Add(int a,doule b)//c++,编译为 _Z3Addid c编译为Add
{
retrun a+b;
}
调用时: Add(1,(double)2);
c++ call的是 _Z3Addid
c call的是 Add
1.4 extern “C”
以c的风格来编译,以c的方式来call(调用),c++兼容c的编译和调用。
extern "C" int Add(int left,int right)
int main()
{
Add(1,2)
return 0
}

1.5 引用 (底层:编译时也是编译成指针)
1.不开辟空间,和引用的变量共用一块空间,也叫取别名
所以:引用传参和返回引用时,返回的同一块空间。一个改变,另一个也更改。
而通过传值来传参和返回时,会开辟一个临时tmp,传递和返回的是这块临时空间。
2.定义是必须赋初始值。 //也就是定义必须初始化
int& a;(会报错)
int& a=b;和const int a=b;const变量也是一定义就要赋初始值
3.const int& d=i; 引用的权限可以缩小或者不变,但是不可以放大
//通过const引用的权限不可放大 //const的引用无法被赋值为非const的引用
4.关于引用创建临时变量的问题
产生临时变量的引用,需要加const
int i = 0;
double d = 0.0;
const double& ri = i;
//相当于会创建一个doule的tmp,double tmp=(double)i
//然后 double&ri=tmp; 注意临时变量具有常性(const),防止被修改,导致数据异常
//const的引用无法被赋值为非const的引用
int& rd=d;
5.引用和指针区别
sizeof(引用) 结果:引用类型的大小
sizeof(指针)结果:指针变量所占字节数:4或者8
1.5 内联函数 inline
1.类似于c中的宏定义,宏替换,但其无法调试。
2.编译时c++会在调用内联函数的地方展开,没有函数压栈的开销,提升效率。
内联函数 在debug模式下,不会展开,方便调试。
3.lnline对编译器是一种建议,不一定会展开
4.递归和代码很长的不适合采用内联函数。会在每个调用的地方展开,浪费空间太多。
5.lnline声明和定义不可分离,分离会导致连接错误。因为lnline被展开后,不会压栈,也就没有地址,无法通过call方式来连接,只能通过在编译时通过宏替换来展开,分离会导致无法展开。
1.6 auto关键字
可以根据数据自动推到其数据类型
1.auto不可作为参数传递和不可用于数组
int a;
auto &d = a; d的类型是int
auto *f = &a; f的类型是int*
auto f1 = &a; f的类型还是int*
常用于
std::map<std::string,std::string> dict;
std::map<std::string,std::string>::iterator it1 = dict.begin();
auot it2 = dict.begin();
1.7 范围for 基于c++的迭代器iterator来实现的
//&数组名 sizeof(数组名) 范围for(auto& e:数组名) 其余传递的都是指针
for(auto& e:array) //注意此时传递的是整个数组
{
e* = 2;
cout<<e<<" ";
}
cout<<endl;
void TestFor(int array[])
{
for(auto& e:array)//会报错,因为array做参数传递时,传递的是指针
cout<<e<<endl;
}
1.8 C++的nullptr和NULL的区别
#define NULL 0
#define nullptr ((void*)0)
void fun(int n)
{
cout<<"整形"<<endl;
}
void fun(int *p)
{
cout<<"整形指针"<<endl;
}
int mian()
{
fun(0);
fun(NULL); //被处理为fun(0) call _Z3funi
fun(nullptr) //被处理为fun((void*)0) call _Z3funip
return 0;
}

被折叠的 条评论
为什么被折叠?



