const在类和函数之间的运用
第一种情况简单来说就是如果声明了一个const
类但是调用了非const
的方法.那么编译会不通过 -> const
类只能调用const
方法,非const
类就都可以调用
示例代码:
宏定义:
#pragma
#ifndef __CONST_OBJECT__
#define __CONST_OBJECT__
#include <iostream>
#include <string.h>
using namespace std;
class String
{
public:
String(const char* cstr = 0);
~String();
char* get_data() const { return m_data; }
void print() const { cout << "hello world!" << endl; };
private:
char* m_data;
};
inline String::String(const char* cstr) {
if (cstr)
{
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
inline String::~String() {
delete[] m_data;
}
class String_two
{
public:
String_two(const char* cstr);
~String_two();
char* get_two_char() const { return m_two_data; }
void print();
private:
char* m_two_data;
};
inline String_two::String_two(const char* cstr) {
if (cstr)
{
/* 开辟内存空间 */
m_two_data = new char[strlen(cstr) + 1];
strcpy(m_two_data, cstr);
}
else
{
/* 开辟一块放置空字符的内存空间 */
m_two_data = new char[1];
*m_two_data = '\0'; // 字符指针直接指向空字符
}
}
inline String_two::~String_two() {
delete[] m_two_data;
}
void String_two::print() {
cout << "HelloWorld!!!" << endl;
}
#endif // !__CONST_OBJECT__
调用函数:
#include "const_object.hpp"
int main() {
String s("say_good");
String_two st("say_hello");
s.print(); // 因为s当中的print声明成了const.所以这一行会编译通过
st.print(); // 因为st当中的print没有声明成const,所以这一行会编译不通过
return 0;
}
Copy On Write(COW)
主要用来考虑操作符是否需要进行赋值的操作
示例代码:
String operator[] (size_type pos) const { }
上述的方法当中声明了操作符[]
,被定义成了const
,那么就不可以通过str[0] = 'H'
的方式进行赋值,所以在方法当中不需要考虑赋值的实现
示例代码two
:
String& operator[] (size_type pos) { }
上述方法没有将操作符[]
声明成const
,那么就可以进行类似str[0] = 'H'
的赋值操作,所以在方法当中需要考虑赋值的实现
上述提到非const
对象也可以调用const
函数,那么如何区分const
函数是被什么调用的呢?
-
c++
编译器规定:当成员函数因为关键字const
签名不同而被重载的时候-
const
对象只能调用const
函数 -
非
const
对象只能调用非const
函数
-
这就是const
的另一种使用方式