前言
以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点
Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。
本文对读者可以用作自查,答案在后面,需要时自行对照。
问题集
Q15:C++中,float a = 5.5; 语句创建的变量a是float型还是double型?如何指定float?
Q16:bool型变量在class中的大小是1bit还是1byte?为什么?
Q17:#pragma once 和 #ifndef 比起来,有没有不好处?
Q18:#include中,尖括号和""的区别?
Q19:关于VS调试,这个黄色箭头在这里的时候,是否执行这一句了?
Q20:如何理解 “实际上没有什么else if语句”?
Q21:bool型变量可以存储bool表达式吗?
Q22:引用到底是不是变量?
Q23:static变量其实只区分两种,是哪两种?
Q24:为什么不要用global全局变量?
Q25:这个类内Static变量定义,有什么问题没有?(一定要注意)
class MyEntitywithOneStaticProp{
public:
static int x,y; //声明
};
int MyEntitywithOneStaticProp::x = 1; //定义
int MyEntitywithOneStaticProp::y = 2; //定义:绑定了一个分配过的变量
Q26:解释一下类内静态函数为什么不能调用类的普通成员变量?
Q27:说函数体内和体外的static变量没有很大不同,为什么?
Q28:C++中的枚举,如何限定其使用的整形数类型?
Q29:比较好的访问数组元素个数的方式
Q30:这段代码有什么问题?(注意传字符串进函数会如何)
Q31:入参有const,指针或引用,我们在调用GetX()方法的时候,为什么有时候会报错?
Q32:为什么说对类内方法进行列表初始化,而不是从方法中赋值,可以提升性能?
Q33:两种初始化的区别——是不是一个返回指针,一个返回对象本身?
Q34:offset含义?
参考解答
Q15:C++中,float a = 5.5; 语句创建的变量a是float型还是double型?如何指定float?
A15:默认可能是float(4字节),也可能是double(8字节),这个取决于编译器设置。
像cherno的环境下出来就是double,而我是float。
指定float的方法:float a = 5.5f
Q16:bool型变量在class中的大小是1bit还是1byte?为什么?
A16:1byte,即1字节。
Q17:#pragma once 和 #ifndef 比起来,有没有不好处?
A17:这俩东西基本等效,而 #pragma once 是一种后来支持的比较新的格式,基本所有的IDE都会支持他
所以 #pragma once 就足够了,确保 .h 文件不被重复定义
Q18:#include中,尖括号和""的区别?
< >只包含编译器当前目录," "可以是相对路径:
#include"../lib/tree.h"
Q19:关于VS调试,这个黄色箭头在这里的时候,是否执行完这一句了?
A19:没有,还在这里,处于将要执行的状态。
Q20:如何理解 “实际上没有什么else if语句”?
A20:else if 实际上是两个语句放在了一起
Q21:bool型变量可以存储bool表达式吗?
A21:我们可以 bool result = 1 < 2; 但是要注意这只不过是计算结果。
bool 型变量不能直接存储表达式本身,它只能存储表达式计算后的结果。
如果需要存储表达式本身,可以使用字符串或者其他数据结构来表示表达式。
Q22:引用到底是不是变量?
A22:cherno认为不是变量,至少不是新变量。
事实上,它的机制意在为已存在的变量提供了另一个名字,本身没有自己的存储空间,只是所引用变量的一个别名。通常用于函数参数传递,以允许函数修改实际的参数值,或者用于简化代码,使代码更加清晰。
Q23:static变量其实只区分两种,是哪两种?
A23:类内static和类外static
在C++中,static 关键字有几种不同的用法,每种用法都有其特定的意义和用途:
1、函数内部静态变量:
在函数内部使用static关键字声明的变量,其生命周期贯穿整个程序,而不是仅限于函数调用期间。这意味着即使函数调用结束,静态变量的值也会保持不变,直到程序结束。用途:尤其是在需要跨函数调用保持状态但又不希望使用全局变量的情况下。
void function() {
static int count = 0; // 静态变量
count++;
std::cout << "Count: " << count << std::endl;
}
每次调用function()时,count的值都会递增,并且保持之前的值。
2、静态成员变量:
类中的静态成员变量属于类本身,而不是类的任何特定实例。这意味着所有类的实例共享同一个静态成员变量。
用途:共享数据,多个对象需要共享同一份数据时,静态成员变量可以作为一个中央存储点。eg:配置信息,实例数量计数器
class MyClass {
public:
static int value; // 静态成员变量
};
int MyClass::value = 0; // 定义和初始化静态成员变量
任何MyClass的实例都可以访问和修改value,但value是共享的。
3、静态成员函数:
类中的静态成员函数可以被类本身调用,而不需要类的实例。它们不能访问非静态成员变量,因为它们与类的任何特定实例无关。
class MyClass {
public:
static void staticFunction() {
std::cout << "This is a static function." << std::endl;
}
};
MyClass::staticFunction(); // 直接通过类名调用静态成员函数
4、静态全局变量与静态全局函数:
在文件作用域中声明的静态变量,其作用域限制在该文件内,不会被其他文件访问。
static的含义:防止跨翻译单元的链接,避免用全局变量,其设计思想有点类似于class中的private
Q24:为什么不要用global全局变量?
A24:项目一旦大起来,全局变量就是灾难
Q25:这个类内Static变量定义,有什么问题没有?(一定要注意)
class MyEntitywithOneStaticProp{
public:
static int x,y;
};
A25:这不是定义,这只不过是声明,完整的做法如下 :
class MyEntitywithOneStaticProp{
public:
static int x,y; //声明
};
int MyEntitywithOneStaticProp::x = 1; //定义
int MyEntitywithOneStaticProp::y = 2; //定义:绑定了一个分配过的变量
Q26:解释一下类内静态函数为什么不能调用类的普通成员变量?
A26:结合A25,类内static函数在class外定义的时候,就明白为什么不能调用x和y了,作用域之内没有普通成员变量的来源,没法知道他们是什么。
Q27:说函数体内和体外的static变量没有很大不同,为什么?
下面两个有什么区别?
A27:区别不大,只不过二者的作用域不同而已
第一个作用域在函数内
第二个作用于在当前文件
两者都可以在整个程序中拥有全声明周期,为此的另一个例子如下,构造一个单例模式的有效引用(而不是运行后释放)
Q28:C++中的枚举,如何限定其使用的整形数类型?
A28:
enum e_Types : unsigned char{ //这里指定了类型是uchar,只占用8bit整型数,无需使用32位int
A,B,C, D=6 //ABC自动等于123,而D是编程者指定的数值
};
// 调用
e_Types eval = A;
e_Types eval = 6; // 注意,这种情况是不被允许的,失去了enum设计的初衷,会直接报错
Q29:比较好的查询数组元素个数的方式?(提示:不要通过元素内容、找结束符等方式去数)
A29:
Q30:这段代码有什么问题?(注意传字符串进函数会如何)
A30:执行了一次拷贝。而这个对于仅仅是打印的功能来讲,有点太损失性能了
正确的做法是传递一个常量引用,避免拷贝的同时确保不会修改到他。
Q31:入参有const,指针或引用,我们在调用GetX()方法的时候,为什么有时候会报错?
A31:const entity& e是一个常对象,要保证这个常对象不能被改变,因此调用的必须是常函数
注意:常对象只能调用常函数是必须的,如果有需要在常函数中执行成员属性的变化,可以对属性施加mutable
Q32:为什么说对类内方法进行列表初始化,可以提升性能
A32:
Q33:两种初始化的区别是不是一个返回指针,一个返回对象本身?
A33
Q34:这段代码中,offset的含义?
A34:获得内存中某个属性相对于初始地址的偏移量