c++问题记录

需要重拾c++了,对其常见问题进行记录

1.c++变量声明与定义的区别:

声明(declaration):意味着告诉编译器关于变量名称、变量类型、变量大小、函数名称、结构名称、大小等等信息,并且在声明阶段不会给变量分配任何的内存。如果想要在多个文件中使用同一个变量,就必须将声明和定义分离,一般用extern来声明,且不要显示地初始化变量。

定义(definition):定义就是在变量声明后,给它分配上内存。可以看成“定义 = 声明 + 内存分配”。

更多的详见https://www.cnblogs.com/HDK2016/p/10236702.html

2.c++能不能给类的成员变量在声明时初始化?

能。可能早先的版本不能,但是c++11标准下能。有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化。

更多的详见https://www.cnblogs.com/blog-vincent-0x1F7/p/9668524.html

3.auto定义的类型必须要有初始值,因编译器要通过其初始值来推断其所属类型。

4.重载和重写的区别:

重载:允许存在多个同名函数,它们的参数表不同,编译器根据函数不同的参数表,对同名函数的名称做修饰,则这些同名函数就成了不同的函数,如int func(int p)和string func(string p)可能被编译成int_func,str_func,对这两个函数的调用在编译期就确定了,是静态的,故不属于多态(最多属于编译期多态)。注意:不允许两个同名函数除了返回值不同以外其他都相同。

重写(覆盖):子类重新定义父类虚函数的方法,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的对应函数,这样的函数在编译期无法确定,只能运行期绑定。

注意与c++中的隐藏规则相区别:派生类函数会屏蔽与其同名的基类函数(在没有加virtual的情况下)

另外,构造函数可以重载,但不能重写,析构函数可以重写

更多的详见http://m.nowcoder.com/questions?uuid=4fff9573339149ccaa4911c9e7f6e6be

                  http://m.nowcoder.com/questions?uuid=2c92cf202e3346c0932d6ae3d3ea2a51

5.普通引用无法绑定字面值

比如,bool find_char(string &s1, string& s2)

string o1 = "o";

然后调用find_char("hello", o1),这样是会报错的,必须改成find_char(const string &s1, string& s2)才对

(PS:这很正常,平时定义引用变量时也必须赋给它一个对象而非字面值,比如int &a = 10;是错误的)

6.“常量引用可以绑定非常量对象”

详见https://blog.csdn.net/baidu_34263241/article/details/82348918

7.默认构造函数没有参数

8.一个类的static成员变量必须在类声明的外部进行初始化,除非该成员变量为constexpr类型。constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。最基础的常量表达式就是字面值或全局变量/函数的地址或sizeof等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。constexpr值可用于enum、switch、数组长度等场合。

9.指针和引用的区别

指针一般指的是某块内存的地址,通过这个地址,我们可以寻址到这块内存;而引用是一个变量的别名。指针可以为空,引用不能为空

10.static的各种用法

https://blog.csdn.net/weixin_40311211/article/details/82851300

11.初始化参数列表与构造函数区别

(1)首先,初始化参数列表先于构造函数初始化,因为初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数,如果不指定,编译器则会调用基类的默认构造函数(比如如果不在子类的初始化列表中调用基类构造函数,那么会自动调用基类的默认构造函数,然后再在子类的构造函数中初始化(其实之前已经被基类默认构造函数初始化了,这里只能算赋值,不能算初始化)的话就会有两次调用,使得性能下降(2)常量数据成员只能通过构造函数初始化表对其进行初始化 (3)类的静态成员变量不能用参数初始化表初始化,也不能在构造函数中初始化。

参考https://blog.csdn.net/hanzhen7541/article/details/99070748

https://zhuanlan.zhihu.com/p/33004628

https://www.zhihu.com/question/60546182

12.c++中的四种cast

https://www.jb51.net/article/36914.htm

https://www.cnblogs.com/hana12169/p/4055035.html

https://blog.csdn.net/starryheavens/article/details/4617637

https://www.cnblogs.com/hhxj/p/11299828.html

几种cast和直接用c语言强制转换有什么区别

https://blog.csdn.net/lihaidong1991/article/details/92635366?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

http://blog.sina.com.cn/s/blog_4a84e45b0100f57m.html

https://bbs.csdn.net/topics/80244371

13.extern C的作用

https://www.jianshu.com/p/bd112adc4565

https://www.cnblogs.com/xiangtingshen/p/10980055.html

https://blog.csdn.net/qq_30891813/article/details/87631651

14.模板成员函数不可以是虚函数。

https://blog.csdn.net/breakpoints_/article/details/93875243

15.c++为何要用inline函数(防止函数递归调用浪费栈空间)

https://www.runoob.com/w3cnote/cpp-inline-usage.html

16.c++友元函数

https://www.runoob.com/cplusplus/cpp-friend-functions.html

17.c++运算符重载的两种方式

https://www.runoob.com/cplusplus/cpp-overloading.html

http://c.biancheng.net/view/1505.html

18.c++实现矩阵类

https://www.cnblogs.com/zxher/archive/2010/10/25/1860745.html

https://blog.csdn.net/m0_37772174/article/details/83018940

19.父类指针指向子类对象,只能调用父类中的函数(若为虚函数,则调用的是子类的实现),这便为多态,多态的作用个人猜测的两点为:(1)方便,一个父类指针可指向不同的子类对象调用 (2)安全,这样不会暴露子类独有的函数和成员

20.数组指针和指针数组区别

https://www.cnblogs.com/mq0036/p/3382732.html

21.为何构造函数和析构函数没有返回值?

构造函数和析构函数是两个非常特殊的函数:它们没有返回值。这与返回值为void的函数显然不同,后者虽然也不返回任何值,但还可以让它做点别的事情,而构造函数和析构函数则不允许。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由客户程序员自己来显式的调用构造函数与析构函数,这样一来,安全性就被人破坏了。另外,析构函数不带任何参数,因为析构不需任何选项。

22.有纯虚函数的类不能被实例化,这样的设计是为了什么?编译器报错"Pure Virtual Function Called”又是为什么

https://www.cnblogs.com/cswuyg/archive/2012/08/22/2650610.html

https://www.cnblogs.com/chutianyao/p/3973237.html

23.vector的push_back时间复杂度为O(1),分析过程如下:

http://blog.sina.com.cn/s/blog_a2a6dd380102w73e.html

https://blog.csdn.net/ypshowm/article/details/89378409

24.虚继承的作用及虚继承的实现逻辑

https://blog.csdn.net/bxw1992/article/details/77726390/

https://www.wandouip.com/t5i75821/

25.Linux多线程常问问题

https://blog.nowcoder.net/n/1292c13d1d4746728a4d633093e57521

26.虚函数能为内联函数吗

https://blog.csdn.net/cdlwhm1217096231/article/details/90744265

https://www.zhihu.com/question/45894112

27.调用拷贝函数的几种情况及深浅拷贝(编译器实现的拷贝构造函数默认为浅拷贝)

https://blog.csdn.net/weicao1990/article/details/81629955

https://www.cnblogs.com/ybf-yyj/p/9319765.html

https://jingyan.baidu.com/article/2c8c281df2bed20008252ab8.html

28.explicit的作用

https://www.cnblogs.com/Rainingday/p/7850568.html

29.ifndef和ifdef的用法和区别

#ifndef使用场景为:

       1、头文件中使用,防止头文件被多重调用。

       2、作为测试使用,省去注释代码的麻烦。

       3、作为不同角色或者场景的判断使用。

#ifdef使用场景:

判断某个宏是否被定义,若已定义,执行随后的语句。

https://www.cnblogs.com/wanqieddy/p/4377937.html

https://blog.csdn.net/icycityone/article/details/17390943

https://www.cnblogs.com/yanwei-wang/p/8073114.html

https://blog.csdn.net/u012677715/article/details/80685170

30.迭代器失效

https://blog.csdn.net/qq_37964547/article/details/81160505

31.c++ memory order

https://blog.csdn.net/wxj1992/article/details/103656486

32.无论类构造函数中的初始化列表是什么顺序,类的成员变量都将以它们的声明顺序被初始化

33.traits编程技法

https://www.cnblogs.com/mangoyuan/p/6446046.html

34.c语言操作数据库

https://blog.csdn.net/Linux_ever/article/details/50651513?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值