-
根据存储数据的类型,系统将不同类型的数据存储在不同的区域,一般情况下,根据内存用途将内存划分为五个区:
内存区 |
用途解释 |
栈区 |
存储函数的参数、局部变量等 |
堆区 |
由程序员分配、释放内存 |
全局区 |
存储全局变量和静态变量 |
常量区 |
存储常量 |
代码区 |
存储逻辑代码的二进制 |
- explicit 关键字:指定构造函数或转换函数或推导指引为显示,即不能用于隐式转换赋值初始化。默认情况下类构造函数为 implicit(隐式)。如以下的赋值操作将不被允许:
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
// 默认 implicit(隐式转换)
A(int) { } // 转换构造函数
A(int, int) { } // 转换构造函数 (C++11)
operator bool() const { return true; }
};
class B
{
public:
// 申明构造函数使用显示声明,不能隐式转换
explicit B(int) { }
explicit B(int, int) { }
explicit operator bool() const { return true; }
};
int main()
{
A a1 = 1; // OK赋值初始化选择 A::A(int)
A a2(2); // OK:直接初始化选择 A::A(int)
A a3 {4, 5}; // OK:直接列表初始化选择 A::A(int, int)
A a4 = {4, 5}; // OK赋值列表初始化选择 A::A(int, int)
A a5 = (A)1; // OK:显式转型进行 static_cast
if (a1) ; // OK:A::operator bool()
bool na1 = a1; // OK赋值初始化选择 A::operator bool()
bool na2 = static_cast<bool>(a1); // OK:static_cast 进行直接初始化
// B b1 = 1; // err赋值初始化不考虑 B::B(int)
B b2(2); // OK:直接初始化选择 B::B(int)
B b3 {4, 5}; // OK:直接列表初始化选择 B::B(int, int)
// B b4 = {4, 5}; // err赋值列表初始化不考虑 B::B(int,int)
B b5 = (B)1; // OK:显式转型进行 static_cast
if (b2) ; // OK:B::operator bool()
// bool nb1 = b2; // err赋值初始化不考虑 B::operator bool()
bool nb2 = static_cast<bool>(b2); // OK:static_cast 进行直接初始化
}