C++基础知识(三)

C里面的宏函数

      C语言中的宏函数会在预处理阶段就去替换程序中的宏,宏函数无法在调试的时候进行检查,并且没有类型检查,还容易写错 ;

      如果对于一个需要经常调用的小函数,使用普通函数,需要频繁的创建栈帧,消耗时间空间,所以C++中引入了内联函数;

inline --内联函数

内联函数是C++的一个特质,内联函数会在调用函数的时候展开,而不是创建堆栈去call一个函数,没有函数调用堆栈的一个开销,可以提升函数的运行效率。                                        内联函数的性质:其实是在编译器中用时间换空间(这里的空间指的就是编译出来的可执行程序的大小),在编译阶段,就会把add内联函数展开。

        对于一些较长的函数,即使前面加了Inline关键字,编译器也不会将他视为内联函数进行展开,即自适应内联函数。为什么函数过长之后,编译器不支持展开?主要原因是容易造成代码膨胀,使得可执行程序.exe过大,不利于下载。

 补充说明:内联函数只是向编译器发出请求,而编译器可以忽视这种请求,选而直接call函数;

要注意,使用递归函数的时候不要使用inline关键字。同时,inline不建议声明和定义分开,分离会导致链接错误,因为inline函数并不进入编译阶段程序创建的符号表,没有地址可以找到,最后链接就会失效。

auto ---自定义类型

auto也是c++新出的一个特性,简单来说就是自适应类型,auto定义变量的时候,必须初始化,才能在编译期间推导自己属于什么变量。

注意for(auto x:arr)其中这个x只是arr的一个拷贝,修改x的值并不能修改arr数组中的值,修改arr数组中的值需要用到引用

 auto在指针使用的时候,可以不用带*,但是在使用引用时,必须带&

int main()
{
	int a = 10;
	auto pa = &a;
	auto* pa2 = &a;
	auto& ra = a;
	cout << typeid(pa).name() << endl;
	cout << typeid(pa2).name() << endl;
	cout << typeid(ra).name() << endl;

}

typeid(变量名).name() 可以打印出对象的类型;

auto x=10,b=10.2; //错误,auto的一行类型必须一致
auto arr[]={1,2};//错误,不能用于构建数组
auto x=1,y=2; //正确,类型一致

 auto不能使用的场景:

1、做函数的形参推导名

void test(auto x); //错误,在运行阶段,需要开辟栈帧,而无从推导需要开辟多大的栈帧

 2、不能用于声明数组

nullptr ---空指针类型

void func(int)
{
 cout<<"func(int)"<<endl;
}
void func(int*)
{
 cout<<"func(int*)"<<endl;
}
int main()
{
 func(0);
 func(NULL);
 func((int*)NULL);
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值