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++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决