C++ 位集参考
C++ bitset reference
bitset参考的两个问题:
Q1。有什么办法可以 return 一个 class 私有成员位集吗?
在下面的代码片段中(后面是输出),我试验了常规引用,但它甚至不会修改 Foo class 中的位集成员。
Q2。根据 this question 中的答案,我了解到常规引用没有足够的粒度来指向存储在 bitset
中的单个位,因为 bitset
以更紧凑的形式存储它们。但是,如果这是真的,我的代码如何仍然设法修改行 b3[1] = 0
中 b3 中的第一位?
#include <iostream>
#include <bitset>
using namespace std;
class Foo
{
private:
bitset<4> b1;
public:
inline void print_value()
{
cout << "The bitset b1 is: ( "<< b1 << " )" << endl;
}
inline void set_all() { b1.set(); }
inline bitset<4> get_b1() { return b1; }
inline bitset<4>& get_b1_ref() { return b1; }
};
int main()
{
Foo f;
f.print_value();
f.set_all();
f.print_value();
auto b2 = f.get_b1();
b2.flip();
cout << "The bitset b2 is: ( "<< b2 << " )" << endl;
f.print_value();
auto b3 = f.get_b1_ref();
cout << "The bitset b3 is: ( "<< b3 << " )" << endl;
cout << "b3[0] is ( " << b3[0] << " )"<< endl;
cout << "b3[0] is ( " << b3[1] << " )"<< endl;
b3[1] = 0;
cout << "The bitset b3 after change is: ( "<< b3 << " )" << endl;
f.print_value();
}
Output:
The bitset b1 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b2 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b3 is: ( 1111 )
b3[0] is ( 1 )
b3[0] is ( 1 )
The bitset b3 after change is: ( 1101 )
The bitset b1 is: ( 1111 )
与
auto b3 = f.get_b1_ref();
推导类型不是引用,只有基本类型bitset<4>
。这意味着 b3
不是引用,对 b3
或其内容的所有修改将仅限于 b3
对象本身。
要获得引用,您需要在声明中显式使用 &
:
auto& b3 = f.get_b1_ref();
bitset参考的两个问题:
Q1。有什么办法可以 return 一个 class 私有成员位集吗? 在下面的代码片段中(后面是输出),我试验了常规引用,但它甚至不会修改 Foo class 中的位集成员。
Q2。根据 this question 中的答案,我了解到常规引用没有足够的粒度来指向存储在 bitset
中的单个位,因为 bitset
以更紧凑的形式存储它们。但是,如果这是真的,我的代码如何仍然设法修改行 b3[1] = 0
中 b3 中的第一位?
#include <iostream>
#include <bitset>
using namespace std;
class Foo
{
private:
bitset<4> b1;
public:
inline void print_value()
{
cout << "The bitset b1 is: ( "<< b1 << " )" << endl;
}
inline void set_all() { b1.set(); }
inline bitset<4> get_b1() { return b1; }
inline bitset<4>& get_b1_ref() { return b1; }
};
int main()
{
Foo f;
f.print_value();
f.set_all();
f.print_value();
auto b2 = f.get_b1();
b2.flip();
cout << "The bitset b2 is: ( "<< b2 << " )" << endl;
f.print_value();
auto b3 = f.get_b1_ref();
cout << "The bitset b3 is: ( "<< b3 << " )" << endl;
cout << "b3[0] is ( " << b3[0] << " )"<< endl;
cout << "b3[0] is ( " << b3[1] << " )"<< endl;
b3[1] = 0;
cout << "The bitset b3 after change is: ( "<< b3 << " )" << endl;
f.print_value();
}
Output:
The bitset b1 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b2 is: ( 0000 )
The bitset b1 is: ( 1111 )
The bitset b3 is: ( 1111 )
b3[0] is ( 1 )
b3[0] is ( 1 )
The bitset b3 after change is: ( 1101 )
The bitset b1 is: ( 1111 )
与
auto b3 = f.get_b1_ref();
推导类型不是引用,只有基本类型bitset<4>
。这意味着 b3
不是引用,对 b3
或其内容的所有修改将仅限于 b3
对象本身。
要获得引用,您需要在声明中显式使用 &
:
auto& b3 = f.get_b1_ref();