{
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)应该编译不通过吧?
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,^_^)
这也是为什么加上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 ;
}
表达得不怎么清楚,自己写得也有些晕了,
但还望大侠们指点!
但我也有听过这样的解释:
好象也有点道理:
类对象中的数据(即声明的变量)是放在堆区?
而函数是放在代码区,并且该类的所有的对象
共享该函数(是不是每个对象都有个指针指向放该函数的内存?声明对象时就分配的?)
所以:
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
const对象只能调用const成员函数。 所以你的text函数里面, const A a如果要调用get_i,就只能把这个函数声明成const
#7
同意 lqqchen2003。
你要好好理解什么是 const 才好。
const对象只能调用const成员函数
类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是 static 的,也是放在全局数据区的。
只有使用了new 操作的,才在堆里存放。
你要好好理解什么是 const 才好。
const对象只能调用const成员函数
类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是 static 的,也是放在全局数据区的。
只有使用了new 操作的,才在堆里存放。
#1
A中没有text函数啊?
c.text(b)应该编译不通过吧?
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,^_^)
这也是为什么加上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 ;
}
表达得不怎么清楚,自己写得也有些晕了,
但还望大侠们指点!
但我也有听过这样的解释:
好象也有点道理:
类对象中的数据(即声明的变量)是放在堆区?
而函数是放在代码区,并且该类的所有的对象
共享该函数(是不是每个对象都有个指针指向放该函数的内存?声明对象时就分配的?)
所以:
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
const对象只能调用const成员函数。 所以你的text函数里面, const A a如果要调用get_i,就只能把这个函数声明成const
#7
同意 lqqchen2003。
你要好好理解什么是 const 才好。
const对象只能调用const成员函数
类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是 static 的,也是放在全局数据区的。
只有使用了new 操作的,才在堆里存放。
你要好好理解什么是 const 才好。
const对象只能调用const成员函数
类对象中的数据(即声明的变量)是放在堆区?
》》
不一定,如果对象是全局的对象的话,是放在全局数据区。
对象是局部对象的话,是放在栈区。
如果是 static 的,也是放在全局数据区的。
只有使用了new 操作的,才在堆里存放。