C++基础知识简答题

1、C++ 可执行程序的内存分布

BSS:Block Started by Symbol 
存放程序中未初始化的全局变量 
数据段: 
存放已初始化的全局变量,静态内存分配 
代码段: 
存放执行代码 
堆heap: 
存放运行中动态分配的内存段,可扩张或缩减 
栈stack: 
存放程序的局部变量,在函数被调用时,栈还用来传递参数和返回值

2、C++编译原理

1、预编译:宏展开过程 
2、编译:inline在此时展开,从C++代码到汇编语言 
3、汇编:汇编语言到机器语言 
4、链接 
引申:内联函数和宏: 
两者都可以节省函数栈的开销,提高运行效率。因为函数在运行时需要保持现场和上下文后恢复现场,有时间和空间的开销 
宏在调用时直接展开,更有效率,但不能使用私有成员,不能调试,容易产生二义性 
内联函数由编译器展开

3、C++ extern关键字的作用

加在变量或函数前,表明该内容的定义在其他文件中。 
extern “C” 提示C++编译器按C语言的规则编译函数,举例: 
C++生成的动态库.so文件,如果按C++命名,则函数的名称会因为继承等原因变化,比如func()会变成func_%20(),其他程序调用dlopen动态打开该库时,按照func名称会搜索不到相应的函数。

4、static关键字的作用

在全局变量中加static,称为静态全局变量有以下特点: 
在数据段中存放 
会被自动初始化成0 
在文件之外不可见

另外,static修饰函数,可以使其成为类的静态成员函数,成员变量和类相关,和类的对象无关。 
及时没有具体对象,也能调用类的静态成员函数——单例模式

5、const关键字的作用

主要有四个方面:常量、函数输入、函数输出、成员函数,都是为了让被修饰的内容受到保护,防止意外修改 
1、const修饰常量,最常用,常量不让修改 
2、const修饰输入参数: 
void StringCopy(char dest,const char source),函数体内任何修改source的行为都会报错 
3、如果输入参数采用值传递,由于函数会在栈中自动产生临时变量的复制(拷贝构造函数),因此参数不用加const 
void func(int x)不能用void func(const int x) 
4、引用传递比值传递效率高,但是缺点是参数可能被修改,因此也可以加const修饰 
void func(A& a) –> void func(const A& a) 
5、用const修饰函数的返回值 
如果以指针传递的方式返回,且被const修饰,则赋值给其他指针变量的时候,要求指针也得用const声明: 
const char * GetString(); 
char * str=GetString();——报错 
const char *str=GetString();——正确

如果是值传递,由于函数会自动复制的关系,加const没用

6、const修饰成员函数

任何不会修改数据成员的函数都应声明为const类型 
1、在const成员函数中,不慎修改了数据成员,会报错 
2、在const成员函数中,不慎调用了其他非const成员函数,报错

7、static、const、static const的初始化

1、在类里创建一个const类型变量时,不能给他初值 
理由:编译器必须为const类型变量分配存储空间,但类的声明又不占用存储空间 
class foo 

private: 
const int a= 100;——报错 

只能在构造函数的初始化列表里初始化: 
A::A(int a):bb(a),其中bb的声明为 const int bb; 
2、static修饰的类成员变量,既不能在类定义中初始化,也不能在初始化列表里初始化,只能在外头 
int foo::a=100; 
3、static const也是在类外初始化

8、C++中,new和malloc的区别

new是c++的操作符,malloc是c中的函数 
new可以调用构造函数 delete调用析构函数 
malloc只是单纯的分配内存,不会初始化成员

9、关于C++ 多态和函数表的关系

多态的定义:一个接口,多种方法 
多态和非多态的区别,可以理解为静态编译(重载)和动态编译(虚函数) 
多态是通过虚函数表来实现的,重载在编译时就确定了函数的地址,虚函数的运行地址只能在运行过程中才能确定

10、C++虚函数与构造、析构函数的关系

1、构造函数不能使虚的 
理由:存在虚函数的话,会存在虚函数表vtable,构建的对象会有一个vptr指向虚函数表,所以不能把构造函数放虚函数里 
2、析构函数一般都是虚的 
如果是实的,那么当有一个基类指针指向派生类,那么析构时只会析构基类的成员,造成派生类的成员没有正确释放 
只有是虚的,才会先在虚函数表中找到派生类,再找基类

如果类中有虚函数,不管有多少个,它派生出来的对象大小都会多4字节,是vptr:指向虚函数表的指针

11、C++ 构造函数、拷贝构造函数、赋值函数

1、构造函数、拷贝构造函数 
特点都是“无中生有” 
A a——通过默认构造函数创建一个对象 
2、拷贝构造函数 
用一个类的对象去初始化另一个对象时: 
A b=a; 
A b(a); 
都使用的拷贝构造函数 
浅拷贝:复制一个指针,指向同一个地址空间 
深拷贝:在内存中开辟新的空间,两个对象独立 
拷贝构造函数的声明: 
A(const A& a)

赋值运算函数: 
A& operator=(const A& a)

Linux技术 
1、epoll和select 
当一个程序要读两个以上IO时,如果使用阻塞式IO,那么一个文件描述符阻塞,另一个文件描述符有数据却读不出来,效率很低。 
解决方案有以下几个: 
1、开一个描述符就起一个线程,维护起来比较复杂 
2、用非阻塞IO,得一直轮询 
3、用异步IO,通过信号量或者回调触发 
4、IO多路复用(epoll和select)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux驱动简单介绍

linux驱动简单介绍 驱动基本介绍 驱动。顾名思义就是“驱使硬件设备行动”。设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作。 设备 驱动充当了应用程序和应用软件直接的纽带,它使得应用软件只…

远离客户陷阱小故事 转

出处: http://ilovecode.cnblogs.com 做项目做产品可以有3个境界:1 挣钱的,2 做品牌的,3 很酷的。有的人从境界1做到3,有得人从3做到1。 我是从1做到3,因为有了钱,你才能远离垃圾项目和不…

typename的作用

一、与class的区别 template声明式中&#xff0c;class和typename这两个关键字意义完全相同 template<class T> class Widget; template<typename T> class Widget; 二、什么时候要用typename&#xff1f;比如下面的代码 template <typename C> void …

[转]详细讲解提高数据库查询效率的实用方法、外键关于性能

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t w…

C语言 scanf()和gets()函数的区别

C语言 scanf()和gets()函数的区别 1.相同点&#xff1a;scanf( )函数和gets( )函数都可用于输入字符串 2.不同点&#xff1a;两者在功能上有所区别,具体区别如下&#xff1a; 要实现如下需求“从控制台输入字符串”有如下两种实现方式&#xff1a; 1>使用gets()函数实现使用…

静态链接库与动态链接库的区别

(1)、静态链接库&#xff1a;在链接阶段(生成可执行文件)将库函数全部载入到可执行文件中&#xff0c;可执行文件中包含了所有的库函数 优点&#xff1a;应用程序可以独立运行&#xff1b; 缺点&#xff1a;如果多次调用库中的函数&#xff0c;则该库函数会被调用多次 (2)、动…

用C语言实现SGF格式围棋棋谱解析器

这是本人&#xff08;liigo&#xff09;独立实现的SGF格式围棋棋谱文件解析器&#xff0c;本文介绍其实现细节。网络上肯定可以找到完善的开源的SGF解析器&#xff0c;这是毋庸置疑的&#xff0c;我不直接使用它们&#xff0c;也不参考它们的实现代码&#xff0c;而是自己独立编…

各种***方式说明

使消息保密的技术和科学叫做密码编码学&#xff08;cryptography&#xff09;。密码编码学是密码体制的设计学&#xff0c;即怎样编码&#xff0c;采用什么样的密码体制以保证信息被安全地加密。从事此行业的人员叫做密码编码者&#xff08;cryptographer&#xff09;。 与之相…

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中&#xff0c;位于用户虚拟地址空间顶部的是用…

Uoj 441 保卫王国

Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题.设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]\sum f[v][1] ,f[u][1]w[u]\sum \min(f[v][0],f[v][1])​\) .现在要资瓷修改 \(x\) 的点权 \(w[x]\) ,容易发现修改后只会影响 \(x\) 到根节…

行存和列存的区别

写入&#xff1a; 行存储的写入是一次完成&#xff0c;数据的完整性因此可以确定。 列存储需要把一行记录拆分成单列保存&#xff0c;写入次数明显比行存储多。 行存储在写入上占有很大的优势 数据修改&#xff1a; 行存储是在指定位置写入一次&#xff0c;列存储是将磁盘定位…

javascript中的命名规则和方法

javascript变量名需要遵守两条简单的规则&#xff1a;1、第一个字符必须是字母、下划线&#xff08;_&#xff09; 或美圆符号&#xff08;$&#xff09;。2、余下的字符可以是下划线、美圆符号或任何字母或数字字符。 命名方法&#xff1a;1、Camel标记法——首字母是小写的&a…

jquery插件开发导读

最近发现项目中有些js代码可以重用&#xff0c;但是不知道怎么样组织&#xff0c;在网上调研后&#xff0c;发现jquery插件是一种很好的组织方式&#xff0c;而且项目也采用了jquery框架&#xff0c;所以花了点时间学习jquery插件开发&#xff0c;并且动手将部分项目代码转成jq…

C语言缓冲文件系统和非缓冲文件系统

C 语言所使用的磁盘文件系统有两大类&#xff1a;一类称为缓冲文件系统&#xff0c;又称为标准文件系统&#xff1b;另一类称为非缓冲文件系统。缓冲文件系统的特点是系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从磁盘向内存读入数据时&#xff0c;则一次从磁盘…

Swift 里集合类型协议的关系

&#xfffc; &#xfffc; Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议&#xff0c;可以通过迭代来获取它的元素。 有两个关联类型&#xff1a; /// A type representing the sequences elements.associatedtype Element//…

ASP.NET 实现登录界面(生成验证码)

这周末也没干啥&#xff0c;真正开始ASP&#xff0c;做了个学籍管理系统的登录界面&#xff0c;登录界面主要包括用户名、密码、验证码&#xff0c;界面字体用了<font size"5" color"blue" font-family:"华文琥珀";></font>改变字体…

C/C++语言void及void指针深层探索

1.概述  许多初学者对C/C语言中的void及void指针类型不甚理解&#xff0c;因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说&#xff0c;并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”&#xff0c;void *则为“无…

多域资源整合之基础准备--DNS配置

由于公司的战略调整,需要整合集团内的资源,当然也也包含IT资源,我们需要评估多家公司的IT架构统一,顺利的合并到总集团的IT架构里,这也就产生一个多域的整合的一个案例,在此分享给大家,希望对大家有所帮助&#xff01;篇幅较长&#xff0c;让我们慢慢细化&#xff01; 在这次的…

python__实参前加*和**的(拆包)功能

print(--------元组打散--------) tup(1,2,3) print(tup) print(*tup) print(--------列表打散--------) list[1,2,3] print(list) print(*list) print(--------字符串打散------) strhello print(str) print(*str) print(--------字典打散--------) def func_dic(name,age):pr…

内存淘汰机制 LRU cache

LRU cache机制的目的是为了减少频繁查找的开销&#xff0c;包括磁盘IO等。 (1)、如果LRU中存在则从LRU缓存中查找&#xff0c;查找到了之后放到容器(list)的最前面 (2)、如果缓存中没有&#xff0c;则从其地方(数据库、磁盘、文件)中读取&#xff0c;读取之后放到容器的最前面…