问题:我可以定义赋值运算符而不是复制构造函数吗?对于内部类(未在API中公开),这仍然是一个糟糕的设计实践吗?
我需要它的原因:正如这个问题提到的那样,QObject使其复制构造函数和赋值运算符成为私有,这样如果子类尝试使用其中任何一个,则在编译时发出错误.
我需要以复制"价值",然而定义赋值运算符(而不是"身份"作为该Qobject文档描述,我不随地使用这个类的拷贝构造函数.
我不想编写复制构造函数的原因是它将复制我不会使用的代码.
我是C++的新手,我正在创建我的第一堂课.除了一个错误之外,我有任何错误:
error: expected unqualified-id before & token
Run Code Online (Sandbox Code Playgroud)
赋值运算符签名如下所示:
Job::& operator = (const Job &v )
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我能想到的一切,删除了&,做了Job :: Job&operator,删除了Job.什么都行不通.
我知道这很简单,我只是不知道它是什么.
如果评估为false,Javascript中是否有一些速记来分配变量?
在红宝石中,我可以这样做:
foo |= "bar"
Run Code Online (Sandbox Code Playgroud)
如果foo的计算结果为false,则将"bar"分配给foo,如下所示:(使用该| =运算符)
var cars_by_brand_and_color = {};
for (var car in parking_lot) {
// add a brand if it doesn't exist yet;
// cars_by_brand_and_color['chevrolet'] = {};
cars_by_brand_and_color[car['brand']] |= {};
// and add that color to the brand if it doesn't exist yet;
// cars_by_brand_and_color['chevrolet']['grey'] |= {};
cars_by_brand_and_color[car['brand']][car['color']] |= {};
// now let's add that car;
// cars_by_brand_and_color['chevrolet']['grey']['BDB-565'] = 'Mr. Smith';
cars_by_brand_and_color[car['brand']][car['color']][car['lisence_plate']] = car['owner']
};
Run Code Online (Sandbox Code Playgroud) 我上课了
class Circle : public isCircle{
private :
int x;
int y;
vector<Circle*> _neighbors;
}
Run Code Online (Sandbox Code Playgroud)
where isCircle只是一个接口(使用虚方法),并且_neighbors包含指针的Circles未被此实例分配.我的问题是,在这种情况下,默认的复制和赋值运算符基本上会做深度复制吗?
我有以下代码:
class Sales_item {
public:
int ii;
Sales_item& operator=(const Sales_item &item)
{
cout << "Inside assignment\n"; // Line 1
ii = item.ii;
return *this; // Line 2
}
};
Run Code Online (Sandbox Code Playgroud)
然后,我做了:(只是一个例子)
Sales_item s;
Sales_item s1 = s;
Run Code Online (Sandbox Code Playgroud)
但Line 1没有执行.如何在重载的赋值中"看到"代码才能执行?例如,可能有复杂的代码,我想调试?我试图在第1行设置断点,但程序没有跳到该断点.
为何Line 2回归*this?我试图改变void并获得相同的结果.有什么不同?
我的类Matrix有两个构造函数,包括复制一个,执行深度复制.这种解决方案非常适用于复制另一个对象的明显情况.虽然在以下情况中:
Matrix m = m1 * m2; // for earlier constructed m1 & m2
Run Code Online (Sandbox Code Playgroud)
在我看来效率低下,因为我在乘法运算中创建了一个对象,只是为了复制它而不是直接赋值给m.矩阵可以占据很大的内存.如何更好地处理它,专业人士的常见做法是什么?
矩阵作为二维列表动态实现,如稀疏矩阵的情况.
PS我明白乘法的结果是局部的.然而,我仍然认为,如果没有上述过度计算,它可以以某种方式处理得更好.
有人能解释一下以下每个小程序的结果吗?:
public static void main(String[] args) {
int a = 10;
a = a++;
System.out.println(a);
}
Run Code Online (Sandbox Code Playgroud)
结果是:10
为什么不是11因为a应该在任务后增加?这是因为它涉及到opeartor左右不同的变量=?
下一个:
public static void main(String[] args) {
int a = 10;
a = ++a;
System.out.println(a);
}
Run Code Online (Sandbox Code Playgroud)
结果是:11
可理解,但编译器提出警告:"对变量a的赋值没有效果".结果不同意见.
更新:
我不修改我原来的问题,但我添加这个评论以澄清现在我抓住了警告的含义.也就是说,即使没有赋值(通过简单的语句++ a),结果也是相同的(11).
有三种方法可以使用关键字'new'.首先是正常的方式.假设学生是一个班级.
Student *pStu=new Student("Name",age);
Run Code Online (Sandbox Code Playgroud)
第二种方式.只调用内存空间而不调用构造函数.
Student *pArea=(Student*)operator new(sizeof(student));//
Run Code Online (Sandbox Code Playgroud)
第三种方式称为"放置新".只调用构造函数来初始化meomory空间.
new (pArea)Student("Name",age);
Run Code Online (Sandbox Code Playgroud)
所以,我在下面写了一些代码.
class Student
{
private:
std::string _name;
int _age;
public:
Student(std::string name, int age):_name(name), _age(age)
{
std::cout<<"in constructor!"<<std::endl;
}
~Student()
{
std::cout<<"in destructor!"<<std::endl;
}
Student & assign(const Student &stu)
{
if(this!=&stu)
{
//here! Is it a good way to implement the assignment?
this->~Student();
new (this)Student(stu._name,stu._age);
}
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
这段代码适用于gcc.但是我不确定它是否会导致错误,或者明确地调用析构函数是危险的.打电话给你一些建议?
int x = 3;
int y = 5;
x++ = y;
cout << x << endl;
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码给我一个错误,我得到的具体错误是
左值作为赋值的左操作数.
我正在尝试回顾我的C和C++.从我的理解,上面的代码理论上应该复制y到into 的值x,然后最后增加x复制完成后的值.所以它会打印出"6".
我是C++的新手,我正在努力理解Class是如何工作的.当我遇到这个问题时,我为自己做了一个简单的例子.我的类有一个私有属性num,我试图用这种方式用int初始化它:Number one = Number::ONE;但它不起作用.但是,当我这样做时它工作正常:Number one; one = Number::ONE.我更喜欢第一种选择.请帮忙!
这是我的完整代码:
class Number {
public:
enum {ONE, TWO, THREE, FOUR};
Number();
void print() const;
Number& operator=(int);
private:
int num;
};
Number& Number::operator=(int n) {
num = n;
return *this;
}
int main(int argc, const char * argv[]) {
Number n = Number::ONE; // doesn't work :(
n.print();
return 0;
}
Number::Number() {
num = 0;
}
void Number::print() const {
cout << num << endl;
}
Run Code Online (Sandbox Code Playgroud)