创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
c++系列专栏:C/C++零基础到精通给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
定义一个CTest
类,使用const
关键字定义常量m_b
class CTest
{
public:
int m_a;
const int m_b;
CTest()
{
m_a = 1;
m_b = 2; //m_b常量 这里是赋值
}
};
当我们像其余的变量一样在构造函数中给定初始值时,常量出现了报错:
常量的特性是:定义就必须初始化,一旦初始化后就不能再进行修改
实际上,上面的方式在构造函数中并不是真正的初始化,而是对变量进行赋值
当类中有const类型的变量时,在定义的时候必须要初始化,
而这个初始化操作是在初始化参数列表中完成的,而构造函数的函数体代码中进行的操作严格来说是赋值,而并非初始化。
先执行初始化参数列表,在执行构造函数体中的代码。对于普通的变量来说也可在初始化参数列表中初始化。
初始化参数列表:用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔
像这样:
class CTest
{
public:
int m_a;
const int m_b;
//初始化参数列表:用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔
//使用圆括号做初始化,常量必须在这里初始化,对于变量来说无所谓
CTest() : m_a(2),m_b(3)
{
m_a = 1;
//m_b = 2; //m_b常量 这里是赋值
}
};
初始化参数列表初始化成员的顺序取决于:成员在类中声明的顺序
常函数:类中的成员函数参数列表后面有const修饰时,称之为常函数,其主要作用是为了能够保护类中的成员变量、限制修改。
定义常函数:
与其他的成员函数定义格式不同 ``常函数为: 返回类型 函数名 const {...}
void fun(/* const CTest* const this */)const //指向的值不能修改
{
cout << m_a << " " << m_b << endl;
}
常函数的特性:不能修改类中的非静态成员,因为const修饰this指针变为const 类* const this
,也就是执行 this->变量=val
操作是非法的,但可以查看成员变量。
对于静态成员属性不但能查看,也能对其修改,因为静态成员不是属于对象的,并不在const 约束范围内。
void fun(/* const CTest* const this */)const //指向的值不能修改
{
cout << m_a << " " << m_b << endl;
m_a=10; //变量也不能修改
m_b=10; //常量不能修改
m_c = 20; //在常函数中可以修改静态变量 因为m_c可以不使用this 指针调用
}
如果要通过常函数对类成员属性进行修改,可以通过mutable
关键字:
class CTest
{
int m_a;
mutable int m_b;
void fun()const
{
//m_a = 10; //非法
m b = 20; //合法
}
};
void fun(/* const CTest* const this */)const //指向的值不能修改
{
fun2(); //不能调用普通函数
funstatic();
}
void fun2() //CTest* const this 指针安全级别降级 非法
{
fun(); //指针安全级别 升级
}
static void funstatic()
{
//静态中只能使用静态成员
fun(); //error
fun2(); //error
}
本质区别:常函数 this指针类型: const 类 * const this 普通函数:类 * const this
常函数不能修改类中的成员属性,也不能调用一般函数 (反过来可以) 一般函数可以修改类成员变量 也可以调用常函数
这是因为常量指针升降级的问题:
指针的安全级别不能从高级降到低级,可以从安全级别低升级到高
const int a = 1:
int b = 20;
const int* p1 = &a;
int* p2 = &b;
p2 = p1
:
指针的安全级别降级操作,不允许 错误:C2440 “=”: 无法从const int *
转换为 int *
p1 = p2
:
指针的安全级别升级操作,允许int*
-> const int*
同理,常量对象也不能调用普通的成员函数,只能调用常函数。
#include
#include
using namespace std;
class CTest
{
public:
int m_a;
const int m_b;
static int m_c;
//初始化参数列表:用来真正初始化对象中成员属性,构造参数列表后加冒号,多个成员属性用逗号分隔
//使用圆括号做初始化,常量必须在这里初始化,对于变量来说无所谓
CTest() : m_a(2),m_b(3)
{
m_a = 1;
//m_b = 2; //m_b常量 这里是赋值
}
//初始化参数列表初始化成员的顺序取决于:成员在类中声明的顺序
//常函数和普通函数的区别
/*
1.本质区别:常函数 this指针类型: const 类 * const this 普通函数:类 * const this
2.常函数不能修改类中的成员属性,也不能调用一般函数 (反过来可以) 一般函数可以修改类成员变量 也可以调用常函数
*/
//常函数
void fun(/* const CTest* const this */)const //指向的值不能修改
{
cout << m_a << " " << m_b << endl;
//m_a=10; //变量也不能修改
//m_b=10; //常量不能修改
m_c = 20; //在常函数中可以修改静态变量 因为m_c可以不使用this 指针调用
//mutable关键字:常函数中可以修改变量
/*
int* p=(int *)&this->m_a;
*/
//fun2(); //不能调用普通函数
funstatic();
}
void fun2() //CTest* const this 指针安全级别降级 非法
{
fun(); //指针安全级别 升级
}
static void funstatic()
{
//静态中只能使用静态成员
//fun(); //error
//fun2(); //error
}
};
int CTest::m_c = 10;
int main()
{
CTest tes;
cout << tes.m_a << " " << tes.m_b << endl;
return 0;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |