c++每日十问2-cpp

本文介绍了C++与C语言在面向对象、内存管理和语法特性上的差异,如new/delete运算符、引用、类以及函数重载。同时,讨论了static关键字的作用,包括在局部变量、全局变量、函数和成员变量上的应用。此外,文章还涵盖了智能指针(如auto_ptr、unique_ptr、shared_ptr和weak_ptr)在内存管理中的作用,以及它们各自的特点。提到了内联函数和右值引用在提高效率和优化代码中的角色,以及悬挂指针和野指针的区别。最后,阐述了静态链接和动态链接的原理及其优缺点。

1、 C和C++有什什么区别?
C++是⾯面向对象的语⾔言,⽽而C是⾯面向过程的语⾔言;
C++引⼊入 new/delete 运算符,取代了了C中的 malloc/free 库函数;
C++引⼊入引⽤用的概念,⽽而C中没有;
C++引⼊入类的概念,⽽而C中没有;
C++引⼊入函数重载的特性,⽽而C中没有


2、 a和&a有什什么区别?
假设数组int a[10]; int (*p)[10] = &a;其中:
a是数组名,是数组⾸首元素地址, +1表示地址值加上⼀一个int类型的⼤大⼩小,如果a的值是0x00000001,加1操作
后变为0x00000005。 *(a + 1) = a[1]。
&a是数组的指针,其类型为int (*)[10](就是前⾯面提到的数组指针),其加1时,系统会认为是数组⾸首地址加
上整个数组的偏移(10个int型变量量),值为数组a尾元素后⼀一个元素的地址。
若(int *)p ,此时输出 *p时,其值为a[0]的值,因为被转为int *类型,解引⽤用时按照int类型⼤大⼩小来读取。


3、 static关键字有什什么作⽤用?
修饰局部变量量时,使得该变量量在静态存储区分配内存;只能在⾸首次函数调⽤用中进⾏行行⾸首次初始化,之后的函数调
⽤用不不再进⾏行行初始化;其⽣生命周期与程序相同,但其作⽤用域为局部作⽤用域,并不不能⼀一直被访问;
修饰全局变量量时,使得该变量量在静态存储区分配内存;在声明该变量量的整个⽂文件中都是可⻅见的,⽽而在⽂文件外是
不不可⻅见的;
修饰函数时,在声明该函数的整个⽂文件中都是可⻅见的,⽽而在⽂文件外是不不可⻅见的,从⽽而可以在多⼈人协作时避免同
名的函数冲突;
修饰成员变量量时,所有的对象都只维持⼀一份拷⻉贝,可以实现不不同对象间的数据共享;不不需要实例例化对象即可访
问;不不能在类内部初始化,⼀一般在类外部初始化,并且初始化时不不加 static ;
修饰成员函数时,该函数不不接受 this 指针,只能访问类的静态成员;不不需要实例例化对象即可访问。


4、 #define和const有什什么区别?
编译器器处理理⽅方式不不同: #define 宏是在预处理理阶段展开,不不能对宏定义进⾏行行调试,⽽而 const 常量量是在编译阶
段使⽤用;
类型和安全检查不不同: #define 宏没有类型,不不做任何类型检查,仅仅是代码展开,可能产⽣生边际效应等错
误,⽽而 const 常量量有具体类型,在编译阶段会执⾏行行类型检查;
存储⽅方式不不同: #define 宏仅仅是代码展开,在多个地⽅方进⾏行行字符串串替换,不不会分配内存,存储于程序的代
码段中,⽽而 const 常量量会分配内存,但只维持⼀一份拷⻉贝,存储于程序的数据段中。
定义域不不同: #define 宏不不受定义域限制,⽽而 const 常量量只在定义域内有效。


5、对于⼀一个频繁使⽤用的短⼩小函数,应该使⽤用什什么来实现?有什什么优缺点?
应该使⽤用 inline 内联函数,即编译器器将 inline 内联函数内的代码替换到函数被调⽤用的地⽅方。
优点:
在内联函数被调⽤用的地⽅方进⾏行行代码展开,省去函数调⽤用的时间,从⽽而提⾼高程序运⾏行行效率;
相⽐比于宏函数,内联函数在代码展开时,编译器器会进⾏行行语法安全检查或数据类型转换,使⽤用更更加安全;
缺点:
代码膨胀,产⽣生更更多的开销;
如果内联函数内代码块的执⾏行行时间⽐比调⽤用时间⻓长得多,那么效率的提升并没有那么⼤大;
如果修改内联函数,那么所有调⽤用该函数的代码⽂文件都需要重新编译;
内联声明只是建议,是否内联由编译器器决定,所以实际并不不可控。


6、什什么是智能指针?智能指针有什什么作⽤用?分为哪⼏几种?各⾃自有什什么样的
特点?

智能指针是⼀一个RAII类模型,⽤用于动态分配内存,其设计思想是将基本类型指针封装为(模板)类对象指针,并在
离开作⽤用域时调⽤用析构函数,使⽤用 delete 删除指针所指向的内存空间。
智能指针的作⽤用是,能够处理理内存泄漏漏问题和空悬指针问题。
分为 auto_ptr 、 unique_ptr 、 shared_ptr 和 weak_ptr 四种,各⾃自的特点:
对于 auto_ptr ,实现独占式拥有的概念,同⼀一时间只能有⼀一个智能指针可以指向该对象;但 auto_ptr
在C++11中被摒弃,其主要问题在于:
对象所有权的转移,⽐比如在函数传参过程中,对象所有权不不会返还,从⽽而存在潜在的内存崩溃问题;
不不能指向数组,也不不能作为STL容器器的成员。
对于 unique_ptr ,实现独占式拥有的概念,同⼀一时间只能有⼀一个智能指针可以指向该对象,因为⽆无法进⾏行行
拷⻉贝构造和拷⻉贝赋值,但是可以进⾏行行移动构造和移动赋值;
对于 shared_ptr ,实现共享式拥有的概念,即多个智能指针可以指向相同的对象,该对象及相关资源会在
其所指对象不不再使⽤用之后,⾃自动释放与对象相关的资源;
对于 weak_ptr ,解决 shared_ptr 相互引⽤用时,两个指针的引⽤用计数永远不不会下降为0,从⽽而导致死锁问
题。⽽而 weak_ptr 是对对象的⼀一种弱引⽤用,可以绑定到 shared_ptr ,但不不会增加对象的引⽤用计数。


7、 shared_ptr是如何实现的?
1. 构造函数中计数初始化为1;
2. 拷⻉贝构造函数中计数值加1;
3. 赋值运算符中,左边的对象引⽤用计数减1,右边的对象引⽤用计数加1;
4. 析构函数中引⽤用计数减1;
5. 在赋值运算符和析构函数中,如果减1后为0,则调⽤用 delete 释放对象。


8、右值引⽤用有什什么作⽤用?
右值引⽤用的主要⽬目的是为了了实现转移语义和完美转发,消除两个对象交互时不不必要的对象拷⻉贝,也能够更更加简洁明
确地定义泛型函数


9、悬挂指针与野指针有什什么区别?
悬挂指针:当指针所指向的对象被释放,但是该指针没有任何改变,以⾄至于其仍然指向已经被回收的内存地
址,这种情况下该指针被称为悬挂指针;
野指针:未初始化的指针被称为野指针。


10、静态链接和动态链接有什什么区别?
静态链接是在编译链接时直接将需要的执⾏行行代码拷⻉贝到调⽤用处;
优点在于程序在发布时不不需要依赖库,可以独⽴立执⾏行行,缺点在于程序的体积会相对较⼤大,⽽而且如果静态库更更新
之后,所有可执⾏行行⽂文件需要重新链接;
动态链接是在编译时不不直接拷⻉贝执⾏行行代码,⽽而是通过记录⼀一系列列符号和参数,在程序运⾏行行或加载时将这些信息
传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运⾏行行到指定代码时,在共享执⾏行行内
存中寻找已经加载的动态库可执⾏行行代码,实现运⾏行行时链接;
优点在于多个程序可以共享同⼀一个动态库,节省资源;
缺点在于由于运⾏行行时加载,可能影响程序的前期执⾏行行性能。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值