c++基础知识合集

系列文章目录

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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值