分配给C++;课堂教学法? 我正在学习一个C++的小例子,学习C++。有人已经编写了主函数,如下所示: int main() { map2d p1(1.,3.); const map2d p2(0.,0.); p1.x(); // testing the access to member variable p2.x(); // testing the access to member variable p1.x() = 3.; // changing the member variable return 0; }

分配给C++;课堂教学法? 我正在学习一个C++的小例子,学习C++。有人已经编写了主函数,如下所示: int main() { map2d p1(1.,3.); const map2d p2(0.,0.); p1.x(); // testing the access to member variable p2.x(); // testing the access to member variable p1.x() = 3.; // changing the member variable return 0; },c++,C++,好的。我创建了一个名为map2d的类。直到必须更改成员变量p1.x()=3为止。我的问题是,怎么做?我的班级是这样的: class map2d { private: double xp, yp; public: map2d (double xnew, double ynew): xp(xnew), yp(ynew) {} double x() const { return xp; } // here is my proble

好的。我创建了一个名为map2d的类。直到必须更改成员变量
p1.x()=3为止。我的问题是,怎么做?我的班级是这样的:

class map2d
{
    private: 
        double xp, yp;
    public:
        map2d (double xnew, double ynew): xp(xnew), yp(ynew) {}

        double x() const { return xp; }   // here is my problem
};
我想用
&
返回一个引用,但没有成功。我用了一些东西,比如:

double& x() const { return xp; }

我做错什么了吗?您知道怎么做吗?

您不能从标记为
常量的方法返回对不可变类成员变量的可修改l值引用。通过将一个方法标记为
const
,您告诉编译器它不会更改任何未标记为
mutable
的数据成员,也不会调用任何可以更改不可变类成员状态的类方法

您基本上需要两个重载版本的访问器函数:

double x() const { return xp; }  //constant version
double& x() { return xp; }       //non-constant version
将选择重载函数的哪个版本取决于调用类方法的上下文。这取决于调用方法的类实例是常量还是可变类引用。例如:

void func_a(const map2d& map)
{
    double x = map.x();  //calls const version
    /* map.x() = 5;  <== calls const version but you'll get a compiler error
                         for returning a non-l-value on left-hand-side of 
                         assignment operator */
}

void func_b(map2d& map)
{
    map.x() = 5;        //calls non-const version
    double x = map.x()  //still calls non-const version
}
void func_a(常量贴图2D和贴图)
{
double x=map.x();//调用const version

/*map.x()=5;您不能从标记为
const
的方法返回对不可变类成员变量的可修改l值引用。通过将方法标记为
const
,您告诉编译器它不会更改任何未标记为
mutable
的数据成员,也不会调用任何类方法这可以更改不可变类成员的状态

您基本上需要两个重载版本的访问器函数:

double x() const { return xp; }  //constant version
double& x() { return xp; }       //non-constant version
将选择重载函数的哪个版本取决于调用类方法的上下文。这取决于调用该方法的类实例是常量还是可变类引用。例如:

void func_a(const map2d& map)
{
    double x = map.x();  //calls const version
    /* map.x() = 5;  <== calls const version but you'll get a compiler error
                         for returning a non-l-value on left-hand-side of 
                         assignment operator */
}

void func_b(map2d& map)
{
    map.x() = 5;        //calls non-const version
    double x = map.x()  //still calls non-const version
}
void func_a(常量贴图2D和贴图)
{
double x=map.x();//调用const version

/*map.x()=5;尝试了解const正确性,那么它将是显而易见的。您尝试过读取任何编译器的错误消息吗?尝试了解const正确性,那么它将是显而易见的。您尝试过读取任何编译器的错误消息吗?您可以从标记为
const
(例如,对静态变量的引用)但是,您不能从“代码> > const 方法返回对非代码>可更改的< /Cult>成员变量的引用。最后一段是误导性的。应该根据成员函数调用的隐式实例参数是常数还是可变引用来选择重载。我传递了一个引用,我将改变这个值,除非这个值被定义为静态的。@ PATETONIO,C++假定每次通过引用时,除了值被传递通过“代码> const ”之外,你可能会改变这个值。引用另一种说法是C++不允许你删除一个变量的常量而不需要一个变量。const对象的一个不可变成员变量是const;非const引用不是,因此C++不允许您返回const成员函数中的一个不可变成员变量。那么,您可以从标记为“代码> const >的方法返回一个L值引用(例如,引用静态变量)。但是,您不能从“代码> > const 方法返回对非代码>可更改的< /Cult>成员变量的引用。最后一段是误导性的。应该根据成员函数调用的隐式实例参数是常数还是可变引用来选择重载。我传递了一个引用,我将改变这个值,除非这个值被定义为静态的。@ PATETONIO,C++假定每次通过引用时,除了值被传递通过“代码> const ”之外,你可能会改变这个值。引用另一种说法是C++不允许你删除一个变量的常量而不需要一个变量。const对象的非可变成员变量是const;非const引用不是,因此C++不允许您返回const成员函数中的一个不可变成员变量。