C++基础, const的问题

icehawk 2009-03-07 11:59:39
初学c++,在常量部分有些不理解,请帮解答一下,谢谢。

问题1,常指针,为什么错误,代码如下
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char *prt2 = str2;
cout << "prt1:" << prt1 << endl;
cout << "prt2:" << prt2 << endl;
*prt1 = str2; //错误,请问为什么?
cout << "prt1:" << prt1 << endl;
prt2 = str1;
cout << "prt2:" << prt2 << endl;


问题2,常成员函数一般怎么用?目的是什么?
class R
{
public:
print();
print() const;
}


问题3,常成员变量怎么初始化?
class A
{
private:
const int X;
static int Y;
pulbic:
const int Z;
}



...全文
289 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy18246 2009-03-18
  • 打赏
  • 举报
回复
const char *prt2 = str2;
这句从右向座读作:prt2是一个指向char类型对象的const指针;
这样的一种声明方式的作用是你既不可以修改prt2所指向对象的内存地址也不能利用指针的解引用方式修改对象的值!
l_yutao 2009-03-08
  • 打赏
  • 举报
回复
1.这是个指针常量和常量指针的问题,指针常量一经初始化后,它本身的内容不能被修改,而它所指向的内容可以修改,像题目中的prt1就是一个指针常量,
*prt1 = str2;
这一句中,prt所指向的内容是字符串,str2是一个首地址,把一个地址给一个字符串的第一个字符,语法上不对,也没有意义,即使 prt1=str2;也不对,因为prt1是一个常量,常量是不能被赋值的。
2.常成员函数与常对象是紧密联系的,学习的时候不要把它们分离开了。
3.常数据成员只能通过初始化列表对其进行初始化。
icehawk 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zwicker 的回复:]
引用 14 楼 lingyin55 的回复:
prt1 = str2; 这样是不行的,编译不通过

这样的编译肯定不能通过啦,prt1不能改变所指向的对象。

而你之前的*prt1 = str2;是可以通过的,它没有改变所指向的对象,只是改变所指向对象的内容,但是这样做可以说没有意义。

引用 9 楼 icehawk 的回复:
引用 1 楼 hairetz 的回复:
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char …
[/Quote]
强制转换?请问怎么转呢?
icehawk 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 icehawk 的回复:]
谢谢16楼,树上也这么说,现在的疑问是
C/C++ codeclassR
{private:inta, b;public:
testfun_0006_const_R()
{
a=100;
b=200;
}voidprint(){printf("%d",a);};voidprint()const{printf("%d", b);};
};

R a;
a.print();constR b;
b.print();
两次输出都是100,为什么?
[/Quote]
抱歉,编译的时候没有重新全编译过,所以错掉了,输出100和200,
谢谢16楼的kiffa, 谢谢大家

ps,郁闷 “回复太快!如果您是恶意刷楼,将会受到严厉惩罚!”
jakqigle 2009-03-07
  • 打赏
  • 举报
回复
楼上的都讲的很清楚了,楼主实验也应该没有问题了吧,那就只接分lei,嘻嘻^_^
icehawk 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zwicker 的回复:]
引用 14 楼 lingyin55 的回复:
prt1 = str2; 这样是不行的,编译不通过

这样的编译肯定不能通过啦,prt1不能改变所指向的对象。

而你之前的*prt1 = str2;是可以通过的,它没有改变所指向的对象,只是改变所指向对象的内容,但是这样做可以说没有意义。

引用 9 楼 icehawk 的回复:
引用 1 楼 hairetz 的回复:
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char …
[/Quote]
可以的,编译和运行都没问题,就是输出结果不对,不理解啊,头大
icehawk 2009-03-07
  • 打赏
  • 举报
回复
谢谢16楼,树上也这么说,现在的疑问是

class R
{
private:
int a, b;
public:
testfun_0006_const_R()
{
a = 100;
b = 200;
}
void print(){printf("%d",a);};
void print() const {printf("%d", b);};
};

R a;
a.print();
const R b;
b.print();

两次输出都是100,为什么?
icehawk 2009-03-07
  • 打赏
  • 举报
回复
谢谢大家解惑,我在实验一下
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icehawk 的回复:]
引用 2 楼 hairetz 的回复:
class R
{
public:
print();
print() const;
}
目的是保证print函数里,不会发生改变变量值的情况

谢谢,不过还是不理解

C/C++ code
class R
{
public:
print();
print() const;
}

R a;
a.print();



这样的话,调用的是哪一个print呢?
[/Quote]

你自己先跑跑,这个print的重载的名字跟参数都一样,估计本身都无法编译通过.
zwicker 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lingyin55 的回复:]
prt1 = str2; 这样是不行的,编译不通过

这样的编译肯定不能通过啦,prt1不能改变所指向的对象。

而你之前的*prt1 = str2;是可以通过的,它没有改变所指向的对象,只是改变所指向对象的内容,但是这样做可以说没有意义。

引用 9 楼 icehawk 的回复:
引用 1 楼 hairetz 的回复:
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char *prt2 = str2;
cout <…
[/Quote]
*ptr1=str2;编译也不能通过的,除非你用强制转换
kiffa 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icehawk 的回复:]

谢谢,不过还是不理解
classR
{
public:
print();
print()const;
}

R a;
a.print();

这样的话,调用的是哪一个print呢?
[/Quote]

这种重载由调用成员函数的对象的常量性来决定:
R a;
const R ca;
a.print();//调用R::print();
ca.print();//调用R::print()const;
lzonline01 2009-03-07
  • 打赏
  • 举报
回复
应该是执行没有const的语句
lingyin55 2009-03-07
  • 打赏
  • 举报
回复
prt1 = str2; 这样是不行的,编译不通过

这样的编译肯定不能通过啦,prt1不能改变所指向的对象。

而你之前的*prt1 = str2;是可以通过的,它没有改变所指向的对象,只是改变所指向对象的内容,但是这样做可以说没有意义。

[Quote=引用 9 楼 icehawk 的回复:]
引用 1 楼 hairetz 的回复:
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char *prt2 = str2;
cout < < "prt1:" < < prt1 < < endl;
cout < < "prt2:" < < prt2 < < endl;
*prt1 = str2; //错误,请问为什么?
cout < < "prt1:" < < prt1 < < endl;
prt2 = str1;
cout < < "prt2:" < < prt2 < < endl;

首先你赋值写错了
prt1 = str2; //…
[/Quote]
qq675927952 2009-03-07
  • 打赏
  • 举报
回复
不好意思 这个写错了
A::A(int x,int y)
{
this->x=x;
this->z = z;

}

改为
A():X(10),Z(9){}; //构造函数初始化列表,专为const变量初始化而用,其他的时候,一般可以在构造函数里赋值
qq675927952 2009-03-07
  • 打赏
  • 举报
回复
char * const prt1 = str1; //这说明 prt1 的值是常量,只能进行初始化,初始化完之后就不能修改,但是它指向的内容,可以修改,如 *ptrl =....
const char *prt2 = str2; //这说明 prt2指向的内容不能修改, 但是prt2 的值可以修改,可就是可以指向其它的常串。

class A
{
private:
const int X;
static int Y;
pulbic:
const int Z;
}

中Y的只能进行这样的初始化为 A::Y = 0;
A::A(int x,int y)
{
this->x=x;
this->z = z;

}
lingyin55 2009-03-07
  • 打赏
  • 举报
回复
mark 学习帖
zwicker 2009-03-07
  • 打赏
  • 举报
回复
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char *prt2 = str2;
cout << "prt1:" << prt1 << endl;
cout << "prt2:" << prt2 << endl;
*prt1 = str2; //错误,请问为什么?
cout << "prt1:" << prt1 << endl;
prt2 = str1;
cout << "prt2:" << prt2 << endl;


*ptr1的是一个char类型,而str2则是数组str2[100]的首地址,当然出错
可以这样*ptr1=*str2;或*ptr1=str2[0]
icehawk 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
char str1[100]= "1234567890";
char str2[100]= "2345678909";
char * const prt1 = str1;
const char *prt2 = str2;
cout < < "prt1:" < < prt1 < < endl;
cout < < "prt2:" < < prt2 < < endl;
*prt1 = str2; //错误,请问为什么?
cout < < "prt1:" < < prt1 < < endl;
prt2 = str1;
cout < < "prt2:" < < prt2 < < endl;

首先你赋值写错了
prt1 = str2; //应该是这样,然后就是ptr1指针被声明为con…
[/Quote]
prt1 = str2; 这样是不行的,编译不通过
我看书说用*prt1 = str2;但是我测试不通过
难道是编译器的问题吗?我用dev c++的,应该是gcc的
blackmurder 2009-03-07
  • 打赏
  • 举报
回复
不会编译错误吗?避免写这样名字相同的函数就行了
icehawk 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
class R
{
public:
print();
print() const;
}
目的是保证print函数里,不会发生改变变量值的情况
[/Quote]
谢谢,不过还是不理解

class R
{
public:
print();
print() const;
}

R a;
a.print();

这样的话,调用的是哪一个print呢?
加载更多回复(10)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧