大家进来看一看这个小程序,到底是怎么回事?

时间:2022-09-06 14:15:27
class A
{
public:
    int x;
int get_i(int i) 
{
cout<<"int get_i"<<endl;
return i;
}

void text(const A &a) 
{
cout<<"in text"<<endl;
int ii=a.get_i(3);  //编译通不过?但在函数int get_i(int i) 后加
                    //const就通过了,到底是什么原因?
          int jj=a.x ;    //可以啊                

}
};
void main()
{
A b;
A c;
c.text(b);
}

7 个解决方案

#1


A中没有text函数啊?
c.text(b)应该编译不通过吧?

#2


附上:A类中x没有被初始化,用的时候当心一些就可以了。

#3


老大;a.get_i(3) is a const

#4


你传递a引用给text函数时,声明a时常引用,但你调用的get_i并没有在声明的后边加const,由于编译器还没有聪明到能够帮你检查一下get_i是否会修改a,所以只好报错了。
这也是为什么加上const就正常,因为加上const之后,编译器知道get_i不会a的成员变量,就可以放心在a的常引用上面调用get_i了。
(加const后,如果get_id修改成员变量,则编译到get_i就通不过,用不着等到编译text,^_^)

#5


谢谢楼上的解释

但我也有听过这样的解释:
好象也有点道理:

类对象中的数据(即声明的变量)是放在堆区?
而函数是放在代码区,并且该类的所有的对象
共享该函数(是不是每个对象都有个指针指向放该函数的内存?声明对象时就分配的?)
所以:
void text(const A &a) 
{
cout<<"in text"<<endl;
int ii=a.get_i(3);  // 对象a有个指针(在本函数中不能被改变,因有
                           //const限制?)指向函数get_i(),但你也要保证函
                        //数get_i()在本函数text()中也不能被改变?还是也要
                      //保证函数get_i()里的任何数据不在text函数里被改变?
                     //或保证函数get_i()里的任何数据不在get_i()里被改变?         
         int jj=a.x ;                  

}

表达得不怎么清楚,自己写得也有些晕了,
但还望大侠们指点!




#6


正确解答是:
const对象只能调用const成员函数。 所以你的text函数里面, const A a如果要调用get_i,就只能把这个函数声明成const

#7


同意 lqqchen2003。

你要好好理解什么是 const 才好。
const对象只能调用const成员函数


类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是  static 的,也是放在全局数据区的。

只有使用了new 操作的,才在堆里存放。

#1


A中没有text函数啊?
c.text(b)应该编译不通过吧?

#2


附上:A类中x没有被初始化,用的时候当心一些就可以了。

#3


老大;a.get_i(3) is a const

#4


你传递a引用给text函数时,声明a时常引用,但你调用的get_i并没有在声明的后边加const,由于编译器还没有聪明到能够帮你检查一下get_i是否会修改a,所以只好报错了。
这也是为什么加上const就正常,因为加上const之后,编译器知道get_i不会a的成员变量,就可以放心在a的常引用上面调用get_i了。
(加const后,如果get_id修改成员变量,则编译到get_i就通不过,用不着等到编译text,^_^)

#5


谢谢楼上的解释

但我也有听过这样的解释:
好象也有点道理:

类对象中的数据(即声明的变量)是放在堆区?
而函数是放在代码区,并且该类的所有的对象
共享该函数(是不是每个对象都有个指针指向放该函数的内存?声明对象时就分配的?)
所以:
void text(const A &a) 
{
cout<<"in text"<<endl;
int ii=a.get_i(3);  // 对象a有个指针(在本函数中不能被改变,因有
                           //const限制?)指向函数get_i(),但你也要保证函
                        //数get_i()在本函数text()中也不能被改变?还是也要
                      //保证函数get_i()里的任何数据不在text函数里被改变?
                     //或保证函数get_i()里的任何数据不在get_i()里被改变?         
         int jj=a.x ;                  

}

表达得不怎么清楚,自己写得也有些晕了,
但还望大侠们指点!




#6


正确解答是:
const对象只能调用const成员函数。 所以你的text函数里面, const A a如果要调用get_i,就只能把这个函数声明成const

#7


同意 lqqchen2003。

你要好好理解什么是 const 才好。
const对象只能调用const成员函数


类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是  static 的,也是放在全局数据区的。

只有使用了new 操作的,才在堆里存放。