const在类和函数之间的运用

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的另一种使用方式

posted @ 2024-04-15 18:05  俊king  阅读(16)  评论(0编辑  收藏  举报