const char*和char const*和const char * const

本文详细解析了C++中自定义字符串类的实现,包括构造函数、拷贝构造函数以及重载大于号运算符进行字符串比较的方法。同时深入探讨了const关键字在指针中的应用,解释了为何在处理字符串字面量时需要将其声明为const char*。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String.h文件
#include <iostream>
#include <string>

using namespace std;

class String
{
public:
	String() { s = NULL; }
	String(const char *str);
	friend bool operator>(String &string1, String &string2);
	void display();

private:
	const char *s;
};

String.cpp文件
#include "pch.h" 
#include <iostream>
#include "String.h"

using namespace std;

String::String(const char *str)
{
	s = str;
}
void String::display()
{
	cout << s;
}

bool operator>(String &string1, String &string2)
{
	if (strcmp(string1.s, string2.s) > 0)
		return true;
	else
		return false;
}

主函数
#include <stdio.h>
#include <iostream>
#include "String.h"
#include <cstring>

using namespace std;

int main()
{
	String string1="aello";
	String string2("bookd");
	cout <<(string1>string2) << endl;
	system("pause");
	return 0;
}

这是一个简单的重载string函数以用于比较两个字符串的字典序的程序,程序本身很简单,问题出在一开始的私有成员声明的时候用的是char *s;就会产生如下错误:

系统会自动把“aello”定义为const char[6];把私有数据成员改成了const char *s;之后就可以成功运行。

 

string类的构造函数:

*NBTS:以空字符结束的字符串---传统的c字符串。

所以string本身的带参构造函数就是有string(const char *s),本身就带着const,而const字符是不能赋值给非const的,所以在main函数里调用构造函数时也要带const.

 

string的拷贝构造函数

拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。

String::String(const String &other) 

{

 int length = strlen(other.m_data);

 m_data = newchar[length+1]; 

 strcpy(m_data,other.m_data);

}

 

引用 Thingking in C++的作者Bruce Eckel的回复:限定词const是很严格的,没有强调const的地方时字符数组的字面值。也许有人可以写:char* cp="howdy";编译器将接受它而不报告错误。从技术上讲这是一个错误,因为字符数组的字面值(这里是"howdy")是被编译器作为一个常量字符数组建立的,所引用该字符数组得到的结果是它在内存里得首地址。修改该字符数组里的任何字符都会导致运行时错误,当然,并不是所有编译器都会做到这一点。所以字符数组的字面值实际上是常量字符数组,当然编译器把它们作为非常量看待,这是因为有许多现有的C代码是这样做的。当然,改变字符数组的字面值的做法还未被定义,虽然可能在很多机器上时这样做的。如果想修改字符串,就要将它放到一个数组中:char cp[]="howdy"。

 

  • 对于const char *s来说,const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量。*s是不变的,s是可以改变的,const限定的*s。s被一个解引用运算符修饰,故s是个普通的指针,可以修改,但是s所指向的数据(即*s)由于const的修饰而不可通过指针s去修改。
  • char *const s声明(*const s),(*const s)是char类型的。s被一个解引用运算符和一个const关键词修饰,故s是个不可修改的指针,但可通过指针s去修改s所指向的数据(即*s)。
  • char const *s和const char *s是同一个意思。
  • 如果既不允许s被修改,也不允许s所指向的数据被修改,那么需要声明为const char * const s。

 

现在的排名是117万。

小樊看完请评论验收,耶。

博客写错还改一次,但是华晨宇给我勇气和力量!

华晨宇的新歌《斗牛》巨无敌好听!!!

野性坦露着灵魂纯粹 或者肆意妄为...

mer...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值