c++面试---基本概念

2024-09-05 06:58
文章标签 c++ 面试 基本概念

本文主要是介绍c++面试---基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

构造函数

类可以包含 多个构造函数,不同的构造函数之间必须在 参数数量或参数类型上有所区别。
构造函数是和类名一致,并且没有返回类型,构造函数在定义变量时自动执行。
1.类的构造函数被自动调用执行的情况发生在定义该类的 对象时。
2.局部变量和全局变量是可以重名的,而且一般来说在某个函数体内,局部变量是会覆盖全局变量的。
3.inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度(×)
内联函数与其他普通函数的区别是,内联函数在生成可执行文件时,其代码块是直接嵌入到调用处的,以此减少函数调用的开销提高程序性能,它与宏很类似。内联说明(inline specification)对于编译器来说只是一个建议,编译器可以选择忽略这个建议。也就是说,是否以嵌入式方式存在,是由编译器决定的,并不是一定。
4.class类中成员不显示定义属性时,则默认是private类的,构造函数是私有的话,就限制了创建对象。
6.类外不能访问,私有成员和保护成员。

构造/析构函数性质




存储和分配

1.静态局部变量内存是在运行期分配的,存储在堆栈区(x)
2.malloc申请的是虚拟内存,并不是物理内存。malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。
3.free释放的内存不一定直接还给操作系统,可能要到进程结束才释放。
4.内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存。
5.static 静态变量和静态函数都可以在类外直接访问,
   extern 可以用于声明变量,但是函数声明也可以用,只不过默认就是extern而已。
   const也可以修饰函数或者变量。
6.

编程技巧

1.快速二进制转化
x 与 x-1 每次相与操作都会导致 x 二进制中的一减少一个,如果 x 是500,二进制是111110100,则循环6次可以使得 x 变成 0。
如何快速的求得 x 的二进制数字?
http://blog.163.com/kongdelu2009@yeah/blog/static/111995207201037105051259/
                             
500 = 254+254-8 = 1111 1110+1111 1110 -0000 1000 = 1 1111 0100。
2.i++/++i区别
这个程序循环的次数是 4 次。这里想总结下自加的两个区别。
第一点:记住的是:如果不是赋值语句,则 i++ 与++i 没有区别,结果都是 i +1。同理 for 循环中,两个没有区别。
第二点:如果是赋值语句:a = i++ 与 a =++i;则需要记住:i++先输出后加一,++i 则是先加1后输出。

2.1 ++i 举例
void  main()
{int x = 0, y = 5, z = 3; while(z-->0 && ++x<5) { y= y - 1; } printf("%d, %d, %d\n", x, y, z); }
第一次循环: z = 3 > 0 && x = 1 < 5  ;   x =1; y = 4; z = 2
第二次循环: z = 2 >0 && x = 2 < 5 ;  x = 2  y = 3; z = 1; 
第三次循环: z = 1>0 && x = 3 < 5 ;  x = 3  y = 2; z = 0; 
第四次循环: z = 0 >0  ; 不满足条件,退出。此时 z 已经减一。
则结果是:    x = 3  y = 2; z = -1; 
3.c++--传值,传址与引用

输出的结果:10  20 20
fun2函数是 传址调用,实参是地址变量,用 & 取地址传递给形参指针 *x。在函数中对指针所指向的值进行处理,实现了 n的值变化。
fun3函数是 传引用引用传递就是给实参中的变量起一个别名。引用传递没有自己的单独的内存空间,作为别名,它和实参变量共用一段内存空间,形参用&别名。从而给实参变量起了一个别名,对别名变量进行处理的结果也会影响到实参。
fun1函数是 传值调用传值:实参与形参是两个变量,占用了两个不同的内存空间。所以他们传递是单向的,即实参只能把值传给形参。形参修改后不会影响到实参。
注意的是:fun2已经把 n 的值变成 10,而 fun3 把 n 的值变成 20。所以最后的 n 是 20。
4.传递动态内存
在 swap 函数中, int * temp 新建一个指针但是没有分配内存。而 *temp = *p 是把 *p 纸箱内存中的值拷贝给 *temp,因为 int *temp 没有分配地址。所以系统给了一个随机的地址来存储数值,分配随机地址是一个意外,并且函数结束后收回,造成内存泄漏。因此无法实现交换。
解决办法:
因为 int * temp 没有分配地址,所以造成内存泄漏,我们可以在初始化时候给 temp 分配一个固定的地址。这样就可以实现交换。
 
2.

int *temp 新建一个指针,temp = p ;就是 temp 指向了 p  指向的地址。在 swap 中实现了 p 和 q 所指向的地址交换。但是在 主函数中并没有实现 a 和 b 交换。
3. swap2 和 swap3 可以实现交换

4.

输出是乱码,因为 在 GetMemory中,char p[]= "Hello world"; 分配是一个局部数组,存储在栈区,函数调用完成后,栈中数据不会保存。
修改方法:char p[]= "Hello world"; 改为:char *p = "Hello world"; 是一个全局数组。
5.指针的“传值”与"传址"


在 GetMemory1 中,p所指向的内存地址发生变化,但是 str 并没有发生改变,并不能正确输出。
我们把指针的地址传进去,就和之前的实参传址一样,在函数 GetMemory1内部对 str 所指的内存进行修改。可以正确输出


6.函数返回值来传递动态内存

7. c/c++读入
cin  遇到空格结束读入。
scanf 函数会以空格,回车,TAB按键作为一次的输入。
8.判断字符的大小
 char ch = '3';     //字符定义if(ch >='0'&& ch <='9') //字符比较
两个字符相减是,ASC码相减。
 int x;char ch = '3';x = '9'- ch;
char x;
char ch = '3';
x = '9'- ch +'0'; // '9'-ch得到的是整形,需要+'0',转化为字符形。
int  ch = '3';
printf("%d",ch); //输出是 51,输出是 ch 的ACS码值
char ch = '3';
printf("%c",ch) // 输出的是字符 '3'
strlen(测字符串长度) strcpy(字符串复制) strcmp(字符串比较) strcat(字符串连接)。
feof()函数: 如果文件结束,则返回非0值,否则返回0。
8.逗号运算符
逗号表达式的结果是其最右边表达式的值,其运算规则为:从左至右依次计算表达式值,最终只取最后一个表达式的值为返回值 (3+5,6+8)的值为14 (a=3*5,a*4)的值为60 。

9.指针指向字符
char* s1 = "Hello world";
s1[2] = 'E';     // 错
*(s1 + 2) = 'E';  //错
指针指向字符串时, 字符串是常量,存储在常量区,而指针存储在栈区。 常量是不能修改的。

参考:
来自牛客网的学习笔记。

这篇关于c++面试---基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138260

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序