gpt4 book ai didi

c++ - 为什么这段代码可以编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:45 26 4
gpt4 key购买 nike

确定嵌套在其他对象的私有(private)部分中的对象的访问权限的确切规则是什么?

例如,在下面截取的代码中,proxy_t结构嵌套在 abc_t 的私有(private)部分中,但其方法可用于 main功能。为什么它可以编译?

#include <iostream>
#include <valarray>

using namespace std;

class abc_t{
private:
struct proxy_t{
proxy_t operator()(double& a, double& b){ __a=a; __b=b; return *this; }
double a(){ return __a; }
double b(){ return __b; }
private:
double __a, __b;
};

public:
abc_t( const size_t N ){
_a.resize(N,-101.);
_b.resize(N,-202.);
}
double a(size_t j){ return _a[j]; }
double b(size_t j){ return _b[j]; }

proxy_t operator[](const size_t j) { return _proxy(_a[j],_b[j]); }

private:
valarray<double> _a;
valarray<double> _b;
proxy_t _proxy;
};


int main(){
size_t n_elem=10;
abc_t abc(n_elem);
cout<<"direct: "<< abc.a(1)<<" "<<abc.b(1)<<"\n";
cout<<"proxied:"<<abc[1].a()<<" "<<abc[1].b()<<"\n"; // ain't proxy_t::aa() private?
//cout<<abc[1]; // doomed to fail
}

最佳答案

这一行是我要谈论的重要的一行:

cout<<"proxied:"<<abc[1].a()<<"  "<<abc[1].b()<<"\n";

当你调用abc[1]时,这是abc_t的公共(public)方法。这是有效的。

它返回一个 proxy_t。尽管未定义此类 (proxy_t) 的声明,但您实际上并未使用该返回变量来创建新对象。如果您执行以下操作,它将无法编译。

proxy_t p = abc[1];

它会崩溃,因为正在声明 proxy_t,您正在初始化一个新对象,但是该范围内不存在该类型。由于您实际上并未声明该类型的任何变量,因此不会在该范围内创建任何 proxy_t(这将是非法的)。

由于 proxy_t 是私有(private)的,这仅仅意味着您不能在 abc_t 类之外的任何地方创建该类型的任何对象。但是,它作为返回值传递,这是有效的——没有对象被创建/实例化/声明,只是一个现有的对象被传递。

然后是有趣的部分。对于类,默认情况下一切都是私有(private)的(除非另有说明)。对于结构,默认情况下所有内容都是公开的。因此,proxy_t::a() 是公共(public)的,因此可以在 main 中使用,因为 main 恰好可以访问 proxy_t 对象。

关于c++ - 为什么这段代码可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com