有没有人曾经使用过C++的"贴牌新品"?如果是这样,那该怎么办?在我看来,它只对内存映射硬件有用.
考虑以下:
class A {
public:
const int c; // must not be modified!
A(int _c)
: c(_c)
{
// Nothing here
}
A(const A& copy)
: c(copy.c)
{
// Nothing here
}
};
int main(int argc, char *argv[])
{
A foo(1337);
vector<A> vec;
vec.push_back(foo); // <-- compile error!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显然,复制构造函数是不够的.我错过了什么?
编辑:Ofc.我无法在operator =()方法中更改this-> c,因此我没有看到如何使用operator =()(尽管std :: vector需要).
class C{
//methods and properties
}
void C::some_method(C* b){
delete this;
this = b;
}
Run Code Online (Sandbox Code Playgroud)
这在编译时给出了以下错误:
error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
我的意图:假设有C类的对象a和b.C类的内容可能非常庞大,而且逐字段复制可能非常昂贵.我想以经济的方式a将' '的所有内容替换为' b'.
默认复制构造函数会执行预期的任务吗?
我找到了一个叫做'移动构造函数'的东西 http://akrzemi1.wordpress.com/2011/08/11/move-constructor/
也许,它可能会得到我想要的效果.
在这里,我们有很多关于 const 字段赋值和未定义行为 (UB) 的问题。例如,这个接受的答案说,由于 UB 的原因,不可能为具有 const 字段的类定义复制赋值运算符。
但我检查了 C++ 标准的当前草案版本(N4861)。表示将是 UB [basic.life.8]的部分是:
如果一个对象的生命周期结束后,在该对象占用的存储空间被重用或释放之前,在原对象占用的存储位置上创建一个新的对象,一个指向原对象的指针,一个指向该对象的引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,可用于操作新对象,如果:...
原始对象的类型不是 const 限定的,并且如果是类类型,则不包含任何类型为 const 限定的非静态数据成员或引用类型,并且
现已替换为:
o1 不是一个完整的 const 对象,并且
我的解释是,下面的代码现在没有 UB。这样对吗?我问这个是因为在样本中,没有简历合格的成员 - 所以我仍然不清楚。
#include <iostream>
struct C {
const int i;
void f() const {
std::cout << i << "\n";
}
C(int i) : i(i) {}
C& operator=( const C& );
};
C& C::operator=( const C& other) {
if ( this != &other ) {
this->~C(); // lifetime …Run Code Online (Sandbox Code Playgroud) 我像这样编写STM8 GPIO,PD_ODR_ODR4 = 1;但stm32f10x.h没有此功能,是否有任何.h文件定义了位。
抱歉,我不知道如何更好地解释这个问题。
我尝试了多个GPIO库。
强文本