突破编程_C++_面试(基础知识(1))

1 面试题1:static的用法

static 关键字可用于修饰全局函数和全局变量、函数的局部变量、类数据成员和类函数。
(1)修饰全局函数和全局变量:只能在本代码文件中使用。
(2)修饰函数的局部变量:有默认值0。始终驻留在全局数据区,直到程序运行结束。但其作用域仍为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
(3)修饰类数据成员和类函数:不依赖于类对象的存在而存在。 static 类函数不可以使用 this 指针,同时 static 类函数也不能声明为虚函数

1.1 作用1:保持变量内容的持久

定义为 static 的变量会在程序刚开始运行时就完成初始化,这也是唯一的一次初始化。定义为 static 的变量在程序的运行过程中存储在静态数据区( C++ 的内存包括栈区、堆区、全局区(静态区)、BSS段、文字常量区以及程序代码区)。特别是对于静态局部变量而言,该变量也是始终驻留在全局数据区,直到程序运行结束。

static int s_val = 0;			// 静态全局变量 int main()
{static int val2 = 0;		// 静态局部变量 return 0;
}

上面代码中的 s_valval2 的声明周期均是整个程序运行过程。

1.2 作用2:隐藏

当同时编译多个文件时,被 static 关键字修饰全局函数和全局变量只能在本代码文件中使用,而所有未加 static 前缀的全局变量和函数都具有全局可见性。
该功能在 C 代码中更为常见,用于实现类似 C++ 中的私有成员变量以及私有成员函数的特性。

1.3 作用3:默认初始化为0

C++ 的内存分布中的两个区域:全局区(静态区)与 BSS 段。这两个区域所有的字节默认值都是0x00。
(1)全局区(静态区): 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。
(2)BSS段 :通常是指用来存放程序中未初始化的全局变量、静态变量(全局变量未初始化时默认为 0 )的一块内存区域。

1.4 作用4: static 修饰类数据成员和类函数

(1)static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(2)static 成员函数属于整个类所拥有,这个函数不接收 this 指针,并且只能访问类的 static 成员变量。
(3)static 成员函数不能被 virtual 修饰(即不能为虚函数)。

2 面试题2:const 关键字的作用

使用 const 关键字可以创建命名常量,即具有特定名称的常量变量。const 修饰符用于表示变量的值是不可修改的。例如:

const int val1=1;   

2.1 const 关键字修饰函数入参

设计函数参数的有一个原则是:能用 const 的就用 const(方便调用) 。比如创建一个用于打印字符串的函数。从这个需求来看,这个函数有一个字符串的入参,在其函数体中,只要读入这个字符串入参即可,无需对其修改。如果设计一个按值传递的函数,如下:

void printStr(string& str)		//采用引用的原因是避免值传递带来的拷贝过程,从而造成性能损失
{printf("%s\n",str.c_str());
}  

这样就会带来另外两个问题,第一:该函数只需要读入字符串的入参,并不用对其做修改,而按引用的传递,赋予了这个函数不应该有的权限。第二:不方便调用,比如有如下调用方式:

void printStr(string& str)
{printf("%s\n",str.c_str());
}int main()
{printStr("hello");			//错误:由于字符串 "hello" 是 const 类型,所以这里编译会报错。return 0;
}

因此,最合理的设计就是使用 const 关键字:

void printStr(const string& str)
{printf("%s\n", str.c_str());
}

2.2 const 关键字修饰指针

对指针来说,可以指定指针本身为 const ,也可以指定指针所指的数据为 const ,或二者同时指定为 const 。两者区别如下:
如果 const 位于*的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量。例如:

int a=1;
const int * ptr = &a;		//等同于 int const * ptr = &a;
*ptr = 2;					//错误:不能通过指针来修改变量的值

如果 const 位于*的右侧, const 就是修饰指针本身,即指针本身是常量。例如:

int a = 1;
int b = 2;
int * const ptr = &a;
ptr = &b;					//错误:不能修改指针的指向

2.3 const 关键字在类中的作用

使用 const 关键字修饰的类的成员函数,表明其是一个常函数,可以访问非 const 数据成员,也可以访问 const 数据成员。但是 const 成员函数不能修改类的成员变量,另外类的常对象只能访问类的常成员函数。如下为样例代码:

#include <iostream>
using namespace std;class Student
{
public:Student() {}~Student() {}public:void sayHello() const{m_name = "zhangsan";				//错误: 不能修改类的成员变量printf("%s\n", m_name.c_str());}string getName(){return m_name;}private:string m_name;
};int main()
{Student st;st.sayHello();const Student st2;string name = st2.getName();			//错误: const 对象不能调用非 const 成员函数return 0;
}

2.4 const 与 define 定义常量的区别

(1)处理阶段
const 常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。
define 常量是预处理器预处理阶段完成的,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。
(2)定义不同
define 是宏定义,它最大的特点就是语义替换,它定义的常量值没有类型限定,不做运算,也不做类型检查,在宏出现的地方直接展开。例如:

#define VAL 1+1 //我们预想的 VAL 值是 2 ,我们这样使用 VAL 
double a = VAL/2; //我们预想的a的值是1,可实际上 VAL 的值是 2
//实际上就是 a = 1+1/1 = 2

const 是关键字,其实就是一个只读变量,不能更改,它会在编译时检查数据类型。
(3)存储方式
const 常量存在于程序的数据段。
define 常量存在于程序的代码段。
const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。
就空间效率而言:const 优于 define。
总结上述区别:一般推荐使用const关键字定义常量,因为它具有类型限制,更安全、更可读、更易于维护。

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

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

相关文章

go语言-context的基本使用

1. 什么是 Context&#xff1f; Go 1.7 标准库引入 context&#xff0c;中文译作“上下文”&#xff0c;准确说它是 goroutine 的上下文&#xff0c;包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息&#xff0c;包括&#x…

Backtrader 文档学习- Analyzers - Analyzers Reference(下)

Backtrader 文档学习- Analyzers - Analyzers Reference&#xff08;下&#xff09; 1.PeriodStats &#xff08;1&#xff09;定义 class backtrader.analyzers.PeriodStats() 时间段内基础统计信息 参数&#xff1a; timeframe (default: Years) &#xff0c;见前compres…

HTTP(Java web方向补充篇)

HTTP&#xff08;Java web方向补充篇&#xff09; HTTP简介 概念&#xff1a;Hyper Text Transfer Protocol,超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 HTTP协议特点&#xff1a; 基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模…

如何有效获取 Go 变量类型?探索多种方法

嗨&#xff0c;大家好&#xff01;本文是系列文章 Go 小技巧第九篇&#xff0c;系列文章查看&#xff1a;Go 语言小技巧。 文章目录 Go 的类型系统类型获取使用 fmt.Printf类型选择类型选择反射 reflect.TypeOf 其他注意点错误处理性能考量 总结 在 Python 中&#xff0c;可以使…

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…

求n的k次方

递归法&#xff1a; #include<stdio.h> int mi(int n, int k) {if (k 1) //如果是1次方{return n; //返回n的1次方&#xff08;也就是n&#xff09;}else{return n * mi(n, k - 1); //n*n的k-1次方} } int main() {int n 0, k 0, sum 0;printf("请输入n值…

【Spark实践6】特征转换FeatureTransformers实践Scala版--补充算子

本节介绍了用于处理特征的算法&#xff0c;大致可以分为以下几组&#xff1a; 提取&#xff08;Extraction&#xff09;&#xff1a;从“原始”数据中提取特征。转换&#xff08;Transformation&#xff09;&#xff1a;缩放、转换或修改特征。选择&#xff08;Selection&…

Day02-数据类型和运算符(基本数据类型转换,赋值运算符,算术运算符,关系运算符,逻辑运算符,条件运算符,位运算符,赋值运算符,运算符优先级,标点符号)

文章目录 Java基础语法学习目标1 基本数据类型转换&#xff08;Conversion&#xff09;&#xff08;掌握&#xff09;1.1 自动类型转换&#xff08;隐式类型转换&#xff09;1.2 强制类型转换&#xff08;显式类型转换&#xff09;1.3 基本数据类型与字符串类型的转换 2 运算符…

FluxMQ:新一代的高性能MQTT代理服务器

FluxMQ&#xff1a;新一代的高性能MQTT代理服务器 前言 FLuxMQ是一款基于java开发&#xff0c;支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发&#xff0c;底层采用Reactor3反应堆模型&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;千万、亿级…

二、Gradle 与 Idea 整合

这里写自定义目录标题 1、Groovy简介2、Groovy 安装3、创建 Groovy 项目4、Groovy 基本语法5、在 idea 中创建普通 java 工程 1、Groovy简介 详细了解请参考&#xff1a;http://www.groovy-lang.org/documentation.html 2、Groovy 安装 下载后解压到本地 验证&#xff1a; …

2024美赛数学建模A题思路源码——七鳃鳗性别比例和生态系统关系

赛题目的:分析一个物种根据资源可用性改变其性别比例的能力的利弊。开发一个模型,分析对生态系统中由此产生的相互作用。 问题一.七鳃鳗性别比例对生态系统的影响 问题分析 建立一个简化版的模型,来探讨以下问题: 1.我们假设七鳃鳗种群的增长遵循Logistic生长模型,其中食…

(学习日记)2024.02.01:引用变量 / 默认实参 / 一元作用域运算符 / 函数重载

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【ChatGPT】文本向量化与余弦相似度:揭开文本处理的神秘面纱(5)

1、引言 在这个数字化的时代&#xff0c;我们每天都会面对大量的文本信息&#xff0c;从社交媒体到新闻报道&#xff0c;文本无处不在。但是&#xff0c;计算机要如何理解和处理这些文字呢&#xff1f;本文将为大家揭开其中的一些奥秘&#xff0c;详细解释文本向量化的概念&am…

【开源软件的影响力】浅谈 MySQL 的影响力

随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&#xff0c;促进了软件行业的繁荣。然而&#xff0c;在使用开源软件的过…

postgresql|数据库|pg_repack插件的部署和使用

一&#xff0c; 表和索引的膨胀现象 Postgres SQL 实现的MVCC的机制不同于 oracle &#xff0c; mysql innodb 的 undo tablespace 的机制。 表上所用的更新和删除等操作的行为&#xff0c;都不会实际的删除或修改&#xff0c;而是标记为死元祖 &#xff08;dead rows or dead…

3D应用开发平台HOOPS Platforms优化制造流程和数字化转型

Tech Soft 3D公司的HOOPS Platform &#xff08;包括HOOPS Native Platform 和HOOPS Web Platform&#xff09;&#xff0c;是一种用于开发顶级3D软件的集成技术。具有高性能3D图形&#xff0c;准确&#xff0c;快速的CAD数据转换&#xff0c;3D数据发布以及与流行的建模内核的…

微分几何——梅向明第四版学习笔记(一) 向量函数和曲线论

目录 引出向量函数曲线论简单曲线定义曲线的向量参数表示 曲线的切线【重要】曲线的法面【重要】曲线的自然参数表示 空间曲线曲线的密切平面空间曲线的基本三棱形【重要】单位切向量主法向量副法向量Frenet标架螺旋线的案例 曲线的曲率和曲率半径曲率的几何意义 曲线的挠率挠率…

Compose | UI组件(十三) | Navigation - 页面导航

文章目录 前言Navaigation 的核心概念和组件的更详细说明真实案例带你一步一步了解 Navaigation第一步&#xff0c;新建多个页面第二步&#xff0c;新建一个Activity第三步&#xff0c;新建一个Screen类&#xff0c;用于统一管理导航的常量第四步&#xff0c;新建一个Graph 统一…

玻璃钢制品三维扫描机械抄数全尺寸检测服务对比测量检查重合度

玻璃钢制品是一种广泛应用于建筑、汽车、航空航天等领域的复合材料。其制作过程中&#xff0c;需要确保每个环节的精确度&#xff0c;以确保最终产品的质量和性能。为了实现这一目标&#xff0c;三维扫描仪在玻璃钢制品的生产过程中发挥着至关重要的作用。 CASAIM中科广电高精度…

2024美赛数学建模A题思路分析 - 资源可用性和性别比例

1 赛题 问题A&#xff1a;资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。例…