本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之C++类中的static、const梳理总结(C++基础)
TIPS:一个空类的内存大小为1个字节。 static、const部分知识来源【点击跳转】
class B { };
//sizeof(B) = 1
1.类中的静态成员(static)
类中的静态成员包括静态成员函数和静态成员变量。
1.1 静态成员函数
①不需要类对象便可直接调用,注意静态成员函数不能直接访问成员变量、成员函数及const成员变量及const成员函数。只能访问静态成员变量、类的构造函数。 ②类的静态成员函数没有this指针。 作用:主要是作为该类作用域下的全局函数。 静态成员函数受权限约束(公有权限外部类外可访问,私有权限类外不能访问)。 在类中,声明语法:static 数据类型 函数名(形参列表){函数体} 静态成员的访问方式: a、类名::函数名(); b、类变量名.函数名();
class A
{
private:
public:
A() { }
A(int a_) { }
int a;
//类内静态成员变量初始化,权限为public则类外可以访问。
static void Print(const char* str)
{
//a = 10;错误,无法访问
//A(); 正确。
//Print2(); 错误,静态成员函数无法访问成员函数
//std::cout << this << std::endl;错误,静态成员变量没有this指针
std::cout << "Print" << str << std::endl;
}
void Print2()
{
std::cout << "Print2" << std::endl;
}
};
int main()
{
//访问方式
//与命名空间的访问类似,原理想不多
A::Print("hello");
A a1;
a1.Print("hello !");
return 0;
}
1.2 类中的静态成员变量
必须在类外初始化且只初始化一次!类内可以被成员函数或静态成员函数直接访问。 静态成员变量受权限约束(公有权限外部类外可访问,私有权限类外不能访问)。但类外初始化的时候不收权限约束。 TIPS:静态成员变量在一个类中只有一份,即针对不同的类对象它是公共的。 在类实例化时,静态成员变量不占用申请的内存空间(即一个类对象中它不占空间),它的内存空间直接存储在静态全局区。 类内声明语法:static 数据结构 变量名; 类外定义语法:数据类型 类名::变量名 = 值; 类外访问方式: a、类名::静态成员变量; b、类变量名.静态成员变量; c、通过静态成员函数间接访问。
class A
{
private:
public:
A() { }
A(int a_) { }
int a;
//声明静态成员变量
static int s_a;
static void Print(const char* str)
{
//静态成员函数可以访问静态成员变量
s_a += 1;
std::cout << "static " << str << std::endl;
}
void Print2()
{
//成员函数可以访问静态成员变量
s_a += 1;
std::cout << s_a << std::endl;
}
};
//定义静态成员变量
int A::s_a = 10;
int main()
{
int size = sizeof(A);//4,即没有算上static s_a的大小,内存空间直接存储在静态全局区
//类外访问静态成员函数的方式
A::s_a = 100;
A::Print("hello 1");//static hello 1
A::Print("hello 2");//static hello 2
A a2;
a2.Print2();//103
a2.s_a = 10;
a2.Print2();//11,即可以发现s_a是唯一的,在一个类中。
return 0;
}
int main()
{
int count = 0;
while ((++count) != 3)
{
static int temp = 1;
temp++;
std::cout << temp << std::endl;//2 3,我们可以发现一个静态变量只初始化一次!
}
return 0;
}
2.const成员属性
const可以修饰类内的成员变量和成员属性、静态成员变量、静态成员函数。 const修饰之后,即只可读,不可修改,即常量,但是其不在常量全局区。 const 成员变量/成员函数受权限约束。(公有权限外部类外可访问,私有权限类外不能访问)
2.1 const成员变量及const静态成员变量
const 成员变量,类内初始化方式: ①使用初始化列表初始化,该方式可以通过构造函数重载将const成员变量在不同条件下初始化成不同的值。 ②const 数据类型 变量名 = 值;该方式初始化没有使用初始化列表意义大,使用该方式初始化还不如使用const 静态成员变量。 const 静态成员变量(const static/static const)表示该变量属于类(唯一)且不能修改,即不变且唯一。 const 静态成员变量,声明及定义方式: 类内:const static 数据类型 变量名 = 值;或者 static const 数据类型 变量名 = 值; TIPS:静态const成员变量不能使用初始化列表初始化。且只有静态成员变量才能在类外初始化。
2.2 const 成员函数
const 成员函数:限定函数内不能修改该类的成员函数(静态成员变量除外),防止意外修改,保证程序安全。 语法:数据类型 函数名(形参列表) const{函数体} 访问方式:类变量名.函数名();
2.3 实例
class A
{
private:
public:
//const成员变量的初始化
//该方式可以通过构造函数重载将const成员变量在不同条件下初始化成不同的值
A() :m(11) { }
A(int a_) :m(12) { }
int a;
static int s_a;
//const成员变量声明和初始化
const int m = 100;//TIPS:这样初始化没有使用初始化列表意义大,使用该方式初始化还不如使用const 静态成员变量。
//const 静态成员变量声明
const static int m1;
//const 静态成员变量声明及定义方式一
static const int m2 = 111;
static void Print(const char* str)
{
s_a += 1;
std::cout << "static " << str << std::endl;
}
void Print2()
{
s_a += 1;
std::cout << s_a << std::endl;
}
void Print1() const
{
// a = 100;错误,无法修改。
s_a += 1;
std::cout << "const func " << s_a << std::endl;
}
};
int A::s_a = 10;
//const 静态成员变量定义方式二
const int A::m1 = 200;
int main()
{
A::s_a = 100;
A::Print("hello 1");
A::Print("hello 2");
A a2;
a2.Print2();
a2.s_a = 10;
a2.Print2();
//const成员属性访问方式
int size2 = a2.m;
A a3;
int size5 = a3.m;
int size3 = a2.m1;
int size4 = a2.m2;
a3.Print1();
return 0;
}
3.static和const的区别
①static定义的静态成员变量和静态成员函数都是属于类,而非属于类对象。 ②const成员变量,只有在某个对象生命周期内是常量,而对于整个类来说是可变的(因为const从成员变量可以通过初始化列表进行初始化)。 ③类对象在申请const成员变量占用该类对象的内存空间,而静态成员变量不会占用该类对象的内存空间。 版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:blog.csdn.net/qq135595696…