我遇到了一个我不明白的问题,我希望这里有人可以提供一些见解.简化代码如下(原始代码是自定义队列/队列迭代器实现):
class B
{
public:
B() {};
class C
{
public:
int get();
C(B&b) : b(b){};
private:
B& b;
};
public:
C get_c() { return C(*this); }
};
int main()
{
B b;
B::C c = b.get_c();
c = b.get_c();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
编译时,这会给我以下错误:
foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
foo.cpp: In function 'int main()':
foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here
Run Code Online (Sandbox Code Playgroud)
我可以通过使用两个单独的C变量解决这个问题,因为它们应该是独立的'C'对象,但这只能隐藏问题(我仍然不明白为什么我不能这样做).
我认为原因是参考不能被复制,但我不明白为什么.我是否需要提供自己的赋值运算符和复制构造函数?
我有一个简单的结构Wrapper,由两个模板化赋值运算符重载区分:
template<typename T>
struct Wrapper {
Wrapper() {}
template <typename U>
Wrapper &operator=(const Wrapper<U> &rhs) {
cout << "1" << endl;
return *this;
}
template <typename U>
Wrapper &operator=(Wrapper<U> &rhs) {
cout << "2" << endl;
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我宣布a和b:
Wrapper<float> a, b;
a = b;
Run Code Online (Sandbox Code Playgroud)
分配b到a将使用非const模板赋值操作过载从上方和数字"2"被显示.
令我困惑的是:如果我宣布c和d,
Wrapper<float> c;
const Wrapper<float> d;
c = d;
Run Code Online (Sandbox Code Playgroud)
并且分配d给c,既没有使用两个赋值运算符重载,也没有显示输出; 因此调用默认的复制赋值运算符.为什么分配d到c未使用const重载赋值操作符提供?或者相反,为什么分配b给a …
有人可以证明在Singleton类实现中需要对赋值运算符进行私有化吗?
Singleton& operator=(Singleton const&);私有化解决了什么问题?
class Singleton {
public:
static Singleton& Instance() {
static Singleton theSingleton;
return theSingleton;
}
private:
Singleton(); // ctor hidden
Singleton(Singleton const&); // copy ctor hidden
Singleton& operator=(Singleton const&); // assign op. hidden
~Singleton(); // dtor hidden
};
Run Code Online (Sandbox Code Playgroud) 一本C++ wiki书是指
...在C++ 0x中,这样的赋值操作符被称为一个统一的赋值运算符,因为它消除了需要编写两个不同的赋值运算符...
对于赋值运算符,它按值获取类的类型:
String & operator = (String s) // the pass-by-value parameter serves as a temporary
{
s.swap (*this); // Non-throwing swap
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我试过谷歌搜索这个词,但它似乎没有得到广泛使用.
它从何而来?
从c ++开始,注意到你可以用两种方式初始化变量
int example_var = 3; // with the assignment operator '='
Run Code Online (Sandbox Code Playgroud)
要么
int example_var(3); // enclosing the value with parentheses
Run Code Online (Sandbox Code Playgroud)
是否有理由使用一个而不是另一个?
c++ variable-assignment copy-constructor assignment-operator
我正在使用data.table(1.8.9)和:=运算符来更新另一个表中的值.要更新的表(dt1)有许多因子列,带有更新的表(dt2)具有类似的列,其值可能不存在于另一个表中.如果dt2中的列是字符,我会收到一条错误消息,但是当我将它们分解时,我会得到不正确的值.
如何在不将所有因子首先转换为字符的情况下更新表格?
这是一个简化的例子:
library(data.table)
set.seed(3957)
## Create some sample data
## Note column y is a factor
dt1<-data.table(x=1:10,y=factor(sample(letters,10)))
dt1
## x y
## 1: 1 m
## 2: 2 z
## 3: 3 t
## 4: 4 b
## 5: 5 l
## 6: 6 a
## 7: 7 s
## 8: 8 y
## 9: 9 q
## 10: 10 i
setkey(dt1,x)
set.seed(9068)
## Create a second table that will be used to update the …Run Code Online (Sandbox Code Playgroud) int a[10];
int b[10];
a = b;
Run Code Online (Sandbox Code Playgroud)
//
struct test {
int a[10];
};
test a,b;
a = b;
Run Code Online (Sandbox Code Playgroud)
第一个代码不编译,因为我们不能分配数组,但第二个代码.类的默认赋值运算符不是简单地为每个数据成员调用赋值吗?为什么第二个代码会编译?
vector(以及list其他容器)具有成员函数(MF)assign.我想比较assignMF(范围版本)与赋值运算符.
据我所知,在以下情况下使用是有用的assign:
在其他情况下,assignMF 没有缺点,可以使用赋值运算符.我对吗?使用assignMF 还有其他一些原因吗?
忽略变量的类型,表达式a=b=c是否已在C和C++中定义了行为?
如果是的话,任何人都可以给我官方证据,比如标准中的引号吗?
PS我搜索了链接的任务,但我得到的是关联性,但我没有在C99标准中找到任何关于它的文本.也许我做错了?希望有人能帮助我.
我有一个基类 A 和两个派生类 B 和 C。 B 定义了 = 运算符,将基类 A 作为参数。
在类 B 上调用 = 时,有时会调用基类 A 的运算符而不是 B 中的运算符。
class A {
public:
void operator=(A &) {
printf("A =\n");
};
};
class B : public A {
public:
void operator=(A &s) {
printf("B =\n");
};
};
class C : public A {
};
int main()
{
B b1, b2;
C c;
b1 = b2;
b1 = c;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A =
B =
Run Code Online (Sandbox Code Playgroud)
为什么第一个赋值不调用 B::operator=()?
为什么第二个赋值不调用 A::operator=() ,因为它也是从 …