运算符<<重载和Const引用

时间:2013-12-13 17:04:29

标签: c++ reference operators const

我有一个带有char *的类作为私有成员数据。我正在将类的对象传递给<<的运算符重载。如果我不使用const引用,我会收到一条错误,指出char *是私有成员数据。如果我使用const引用,则此错误消失。

当const引用传递对象时是否可以访问私有成员数据,而不是通过引用传递它?

代码:

// .h file
#include <iostream>
using namespace std;

class Flex
{  
    // The error was caused by having a const in the definition 
    // but not the declaration 
    // friend ostream& operator<<( ostream& o, const Flex& f );  

    // This fixed it
    friend ostream& operator<<( ostream& o, Flex& f );

    public:

    Flex();
    Flex( const char * );
    ~Flex();

    void cat( const Flex& f );

    private:

    char * ptr;
};

// .cpp file
#include <iostream>
#include <cstring>
#include "flex.h"
using namespace std;

Flex::Flex()
{
    ptr = new char[2];

    strcpy( ptr, " ");
}

Flex::Flex( const char * c )
{
    ptr = new char[strlen(c) + 1];

    strcpy( ptr, c );
}

Flex::~Flex()
{
    delete [] ptr;
}

void Flex::cat( const Flex& f )
{
    char * temp = ptr;

    ptr = new char[strlen(temp) + strlen(f.ptr) + 1];

    strcpy( ptr, temp );

    delete [] temp;

    strcat( ptr, f.ptr );
 }

ostream& operator<<( ostream& o, Flex& f )
{
    o << f.ptr;

    return 0;
}

// main.cpp
#include <iostream>
#include "flex.h"

using namespace std;

int main()
{

    Flex a, b("one"), c("two");

    b.cat(c);

    cout << a << b << c;

    return 0;

}

1 个答案:

答案 0 :(得分:1)

  

当const传递对象时,是否可以访问私有成员数据   引用,而不是通过引用传递?

可见性和const是正交概念。您可以通过private参考访问const成员。

你不清楚你得到的实际错误是什么,或者真正的问题是什么。但是,我猜你已经实现了一个免费的operator<<(ostream&, const MyClass&)函数,它以某种方式试图修改MyClass::ptr(或其他一些成员变量)。

如果是这样,那将无效,因为引用为const。不要修改它的成员。