"for"循环中使用的复制构造函数,但在哪里?
Copy constructor used in a "for" loop, but where?
我正在写一个UTF-8字符串类,它是两个const和非const迭代器类。我遇到了一个const问题。下面是这些类:
class Utf8String
{
public:
class ConstIter;
class Iter
{
friend class ConstIter;
private:
Iter();
private:
Utf8String * m_pStr;
utf8::iterator< char * > m_oIter;
public:
Iter( const Iter & );
inline explicit Iter( Utf8String * pStr )
: m_pStr( pStr )
, m_oIter( m_pStr->m_sBuf, m_pStr->m_sBuf, m_pStr->m_sBuf + m_pStr->m_nSize )
{ }
inline Iter & operator = ( const Iter & oIter )
{
m_pStr = oIter.m_pStr;
m_oIter = utf8::iterator< char * >(
m_pStr->m_sBuf,
m_pStr->m_sBuf,
m_pStr->m_sBuf + m_pStr->m_nSize );
return *this;
}
inline operator const char * () const
{
return m_oIter.base();
}
inline uchar32_t operator * () const
{
return *m_oIter;
}
inline Iter & operator ++ ()
{
++m_oIter;
return *this;
}
inline Iter & operator -- ()
{
--m_oIter;
return *this;
}
inline bool operator == ( const Iter & oIter )
{
return m_oIter == oIter.m_oIter;
}
inline bool operator != ( const Iter & oIter )
{
return m_oIter != oIter.m_oIter;
}
};
class ConstIter
{
private:
ConstIter();
private:
const Utf8String * m_pStr;
utf8::iterator< const char * > m_oIter;
public:
ConstIter( const ConstIter & );
inline ConstIter( const Iter & oIter )
: m_pStr( oIter.m_pStr )
, m_oIter( m_pStr->m_sBuf, m_pStr->m_sBuf, m_pStr->m_sBuf + m_pStr->m_nSize )
{ }
inline ConstIter( const Utf8String * pStr )
: m_pStr( pStr )
, m_oIter( m_pStr->m_sBuf, m_pStr->m_sBuf, m_pStr->m_sBuf + m_pStr->m_nSize )
{ }
inline operator const char * () const
{
return m_oIter.base();
}
inline ConstIter & operator = ( const ConstIter & oIter )
{
m_pStr = oIter.m_pStr;
m_oIter = utf8::iterator< const char * >(
oIter.m_pStr->m_sBuf,
oIter.m_pStr->m_sBuf,
oIter.m_pStr->m_sBuf + oIter.m_pStr->m_nSize );
return *this;
}
inline ConstIter & operator = ( const Iter & oIter )
{
m_pStr = oIter.m_pStr;
m_oIter = utf8::iterator< const char * >(
m_pStr->m_sBuf,
m_pStr->m_sBuf,
m_pStr->m_sBuf + m_pStr->m_nSize );
return *this;
}
inline uchar32_t operator * () const
{
return *m_oIter;
}
inline ConstIter & operator ++ ()
{
++m_oIter;
return *this;
}
inline ConstIter & operator -- ()
{
--m_oIter;
return *this;
}
inline bool operator == ( const ConstIter & oIter )
{
return m_oIter == oIter.m_oIter;
}
inline bool operator != ( const ConstIter & oIter )
{
return m_oIter != oIter.m_oIter;
}
};
// More stuff
};
我使用如下:
Utf8String sStr = "not const";
for( Utf8String::Iter i = sStr.Begin(); i != sStr.End(); ++i )
{
}
// 2) Iterating over a const UTF-8 string :
const Utf8String sConstStr = "const";
for( Utf8String::ConstIter i = sConstStr.Begin(); i != sConstStr.End(); ++i )
{
}
// 3) Const interators can also iterate over a non-const string :
for( Utf8String::ConstIter i = sStr.Begin(); i != sStr.End(); ++i )
{
}
问题是,如果迭代器类的复制构造函数没有声明为public,尽管没有显式使用复制构造函数,我还是会得到以下错误:
Error 1 error C2248: 'core::Utf8String::Iter::Iter' : cannot access private member declared in class 'core::Utf8String::Iter' c:xxxmain.cpp 20
将这些复制构造函数声明为public就解决了问题。
发生了什么?编译器是将Utf8String::ConstIter i = sStr.Begin()
优化为Utf8String::ConstIter i( sStr.Begin() )
还是做其他隐式优化?
谢谢你的帮助。:)
编辑:使用VS2005而不是c++ 11.
Utf8String::ConstIter i = sStr.Begin();
是一个声明和一个初始化。它是不是赋值。这个初始化是使用复制构造函数完成的。
相关文章:
- 构造函数在退出函数时无法初始化一个参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 为什么C++构造函数在继承中需要默认参数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- _Pass_fn:构造函数在哪里?
- std::具有initializer_list和size的unordered_map构造函数在main中编译,但不在类定
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 解析野牛:构造函数在行动
- 错误 C2512:没有可用的适当默认构造函数:在构造函数中声明带有参数的对象!
- 在C++中,当重新分配对象时,为什么构造函数在析构函数之前触发?
- 隐式生成的移动构造函数在 c++ 中如何工作?
- 如何防止构造函数在引发异常时创建对象
- 自定义对象构造函数在循环外部循环
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- C++ 默认构造函数在移动和复制构造函数存在时不随"using"继承
- 通过构造函数在类中初始化二维数组
- 为什么默认的构造函数在这里不是 constexpr
- 构造函数在哪里获取/设置默认分配器