C++中int length() const;和const int length();有什么区别?

int length() const;

此只能使用于成员函数,意思为此函数里不能对函数所在类中的所有成员变量进行修改,他相当于对默认传递到length函数里的this指针加上const的限定,const OneClass * this;

const int length();

可以用于成员函数和非成员函数,表示函数返回值是常量。对于int型的返回值,本身就是使用的值传递返回,所以const修饰int返回值是无意义的,在返回指针的情况下const修饰返回值才有意义

class foo
{
public:
	foo()
	{
		n = 10;
	}
	const foo * function1()
	{
		return this;
	}
	foo * const function2()
	{
		return this;
	}
	int n;
};
/*function1函数返回的指针是指向常量的指针,就不能赋值给非常指针,
如:
foo f;
foo * pf1 = f.function1();
这段代码就会报错
而function2函数的const修饰没有任何作用,因为函数返回按照值传递
*/
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据你的要求回答这个问题。以下是一个基于char* 设计的字符串类MyString的实现,具有构造函数、析构函数、复制构造函数和其他相关函数: ```c++ #include <cstring> class MyString { public: // 构造函数 MyString(); MyString(const char* cString); // 复制构造函数 MyString(const MyString& other); // 析构函数 ~MyString(); // 成员函数 char at(int index) const; int length() const; void clear(); bool empty() const; int compare(const MyString& s) const; int compare(int index, int n, const MyString& s) const; void copy(char s[], int index , int n); char* data() const; int find(char ch) const; int find(char ch ,int index) const; int find(const MyString& s, int index) const; void append(const MyString& s); void append(const char* s); void assign(const MyString& s); void assign(const char* s); MyString substr(int index, int n) const; void erase(int index, int n); private: char* m_data; int m_length; // 私有函数 void init(const char* cString); }; MyString::MyString() { m_data = new char[1]; m_data[0] = '\0'; m_length = 0; } MyString::MyString(const char* cString) { init(cString); } MyString::MyString(const MyString& other) { init(other.m_data); } MyString::~MyString() { delete[] m_data; } char MyString::at(int index) const { if (index >= 0 && index < m_length) { return m_data[index]; } else { return '\0'; } } int MyString::length() const { return m_length; } void MyString::clear() { m_data[0] = '\0'; m_length = 0; } bool MyString::empty() const { return m_length == 0; } int MyString::compare(const MyString& s) const { return strcmp(m_data, s.m_data); } int MyString::compare(int index, int n, const MyString& s) const { if (index >= 0 && index < m_length) { return strncmp(m_data + index, s.m_data, n); } else { return -1; } } void MyString::copy(char s[], int index, int n) { if (index >= 0 && index < m_length) { strncpy(s, m_data + index, n); s[n] = '\0'; } else { s[0] = '\0'; } } char* MyString::data() const { return m_data; } int MyString::find(char ch) const { char* p = strchr(m_data, ch); if (p == nullptr) { return -1; } else { return p - m_data; } } int MyString::find(char ch, int index) const { if (index >= 0 && index < m_length) { char* p = strchr(m_data + index, ch); if (p == nullptr) { return -1; } else { return p - m_data; } } else { return -1; } } int MyString::find(const MyString& s, int index) const { if (index >= 0 && index < m_length) { char* p = strstr(m_data + index, s.m_data); if (p == nullptr) { return -1; } else { return p - m_data; } } else { return -1; } } void MyString::append(const MyString& s) { char* newData = new char[m_length + s.m_length + 1]; strcpy(newData, m_data); strcat(newData, s.m_data); delete[] m_data; m_data = newData; m_length += s.m_length; } void MyString::append(const char* s) { MyString str(s); append(str); } void MyString::assign(const MyString& s) { if (this != &s) { delete[] m_data; init(s.m_data); } } void MyString::assign(const char* s) { MyString str(s); assign(str); } MyString MyString::substr(int index, int n) const { if (index >= 0 && index < m_length) { if (n > m_length - index) { n = m_length - index; } char* newData = new char[n + 1]; strncpy(newData, m_data + index, n); newData[n] = '\0'; MyString result(newData); delete[] newData; return result; } else { return MyString(); } } void MyString::erase(int index, int n) { if (index >= 0 && index < m_length) { if (n > m_length - index) { n = m_length - index; } memmove(m_data + index, m_data + index + n, m_length - index - n + 1); m_length -= n; } } void MyString::init(const char* cString) { if (cString == nullptr) { m_data = new char[1]; m_data[0] = '\0'; m_length = 0; } else { m_length = strlen(cString); m_data = new char[m_length + 1]; strcpy(m_data, cString); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值