const
在之前的笔记中我们出现很多次const char* name = “shaojie”,定义一个不可变指针存放字符串。
不可变就来自const,表示“只读、常量”为什么需要它呢?我们需要一些东西不可被修改。
const加数据变量
#include <iostream>
int main()
{
const int MAX_AGE = 99;
MAX_AGE = 250;
}
打印出的MAX_AGE 依旧是99而不是250,因为我们将其定义为“常量”不可变。我们还可以对指针进行常量处理,我们在堆上创建一个整型指针我们赋值为其内容为2并修改其指向的地址偏移一位。
const加指针变量
#include <iostream>
int main()
{
const int MAX_AGE = 99;
MAX_AGE = 250;
int* a = new int;
*a = 2;
a = a+1;
}
对于指针我们可以修改指针地址和指针指向的内容两个东西。
#include <iostream>
int main()
{
const int MAX_AGE = 99;
MAX_AGE = 250;
const int* a = new int;//int const * a = new int;
*a = 2;
a = a+1;
}
const加在*前我们不可以修改指针指向的内容,也就是说*a = 2不好使了。为什么说加载*前?因为对于编译器来说const int* a与int const *a是一个东西,看个人书写习惯。
const加在*之后,我们不可以修改指针指向的地址,就是a = a+1咩有用了。
#include <iostream>
int main()
{
const int MAX_AGE = 99;
MAX_AGE = 250;
int* const a = new int;
*a = 2;
a = a+1;
}
两种写法就类似可见性时的几个关键字一样,两种方式让内容或地址不可更改。
const加方法
方法只在类中是函数别名
class Entity
{
private:
int m_X,m_Y;
public:
int GetPoint()
{
return m_X;
}
void SetPoint(int x)
{
m_X = X;
}
};
GetPoint方法只是返回m_X的值,我们不希望有人修改它怎么办?
class Entity
{
private:
int m_X,m_Y;
public:
int GetPoint() const
{
//m_X = 2;
return m_X;
}
void SetPoint(int x)
{
m_X = X;
}
};
如果在GetPoint让m_X赋值为2是做不到的。这就让方法有了只读的性质。
我们将私有成员换成指针变量。
class Entity
{
private:
int* m_X,*m_Y;
public:
const int* const GetPoint() const
{
//m_X = 2;
return m_X;
}
void SetPoint(int x)
{
m_X = X;
}
};
还记得这三个const的含义吗?第一个不改内容、第二个不改地址、第三个不改方法中成员变量。
还有一件事
class Entity
private:
int* m_X,*m_Y;
对于整型变量我们可以用“,”并列定义,在指针中要记得“*”符号。
然而 const就像是承诺这个MAX_AGE 是一个不变量,那想想你承诺每天背单词,是不是也有不背的时候。const也有例外。
mutable
容易改变,常用在const不可改变的环境下。
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_name;
publiic:
const std::string& GetName() const
{
return m_name;
}
};
int main()
{
const Entity e;
e.GetName();
std::cin.get();
}
const std::string& GetName() const
第一个const表示GetName方法不可更改,第二个const表示GetName内部的私有变量不可更改。
我们在main创建一个不可改变的Entity,我们可以调用GetName方法,。
然而,我们去掉const std::string& GetName() const第二个const就不可引用了。
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_name;
publiic:
const std::string& GetName()
{
count++;
return m_name;
}
};
int main()
{
const Entity e;
e.GetName();//报错
std::cin.get();
}
所以要使用GetName方法我们必须加入const,那如果我想知道GetName在函数内执行了多少次会发生什么呢?
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_name;
int count;
publiic:
const std::string& GetName()const
{
count++;
return m_name;
}
};
int main()
{
const Entity e;
e.GetName();
std::cout<<count<<std::endl;//报错
std::cin.get();
}
std::cout<<count<<std::endl;会报错 原因是什么呢?
const std::string& GetName() const第二个const让方法内变量count和m_name不可更改,然而我们只想改变count。去掉这个const的话GetName函数会报错,所以怎么办呢?
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_name;
mutable int count;
publiic:
const std::string& GetName()const
{
count++;
return m_name;
}
};
int main()
{
const Entity e;
e.GetName();
std::cout<<count<<std::endl;
std::cin.get();
}
只要在count前加入mutable即可
标签:std,const,17,int,GetName,C++,Entity,include From: https://blog.csdn.net/weixin_64418869/article/details/140678759