欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > C++从入门到起飞之——inlinenullptr关键字 全方位剖析!

C++从入门到起飞之——inlinenullptr关键字 全方位剖析!

2024/10/24 21:21:39 来源:https://blog.csdn.net/2301_80221228/article/details/140474866  浏览:    关键词:C++从入门到起飞之——inlinenullptr关键字 全方位剖析!

 

                                                                                个人主页:秋风起,再归来~

                                                                                           C++从入门到起飞                         

                                                                        个人格言:悟已往之不谏,知来者犹可追

                                                                                        克心守己,律己则安!

目录

1、inline

2、nullptr 

3.完结散花


1、inline

• ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就不需要建⽴栈帧了,就可以提⾼效率。

inline int func(int x,int y)
{int ret = x + y;ret += 1;ret += 1;ret += 1;return ret;
}int main()
{//可以通过反汇编观察程序是否展开// 有call func语句就是没有展开,没有就是展开了func(1,1);return 0;
}

 注意:为什么这里加了inline,函数还是没有展开,依然去调用了呢?

这是因为vs编译器debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅。

 好啦,设置好了我们直接来看一下func是否被展开了~

• C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。

• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

 好啦,如果我们在原来的函数上多加一些语句,看看编译器还会不会展开函数呢?

• inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。

2、nullptr 

NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:

#ifndef NULL#ifdef __cplusplus#define NULL    0#else5        #define NULL    ((void *)0)#endif
#endif

C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种 定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的 f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL); 调⽤会报错。

void func(int x = 0)
{cout << "void func(int x = 0)" << endl;
}void func(int* ptr)
{cout << "void func(int* ptr)" << endl;
}int main()
{func(0);// 本想通过f(NULL)调⽤指针版本的func(int*)函数,// 但是由于NULL被定义成0,调⽤了func(int x),因此与程序的初衷相悖。func(NULL);return 0;
}

>本想通过f(NULL)调⽤指针版本的func(int*)函数,但是由于NULL被定义成0,调⽤了func(int x),因此与程序的初衷相悖。 

 >必须将NULL强制类型转化为int*的指针才能达到我们的目的

• C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被 隐式地转换为指针类型,⽽不能被转换为整数类型。

>最后这里再讲一个小的知识点:在C++中(void*)类型的指针不能给给其他类型的指针,而在C语言中是可以的

在C++中

只能通过强转来解决~ C++在这方面检查的比较严格!

在C语言中 

3.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

​​​​

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com