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++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss