我有一个关于选择哪个函数来初始化静态类成员的问题.
//Base.h
class Base
{
private:
static int count;
static int countInit()
{
return 10;
}
public:
Base()
{
}
};
//and Base.cpp
static int countInit()
{
return 0;
}
int Base::count=countInit();//member function is used.
static int local_count=countInit();//the local one in Base.cpp
Run Code Online (Sandbox Code Playgroud)
变量Base::count初始化为Base::countInit()而不是countInit()Base.cpp中定义的变量.但是local_count由当地人初始化countInit.所以,我想知道,在这种情况下是否有像Koenig查找这样的规则?
有三种方法可以使用关键字'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.但是我不确定它是否会导致错误,或者明确地调用析构函数是危险的.打电话给你一些建议?
这是一个我无法解释清楚的问题.
哪个选项错了,为什么?
(A) a += (a++);
(B) a += (++a);
(C) (a++) += a;
(D) (++a) += (a++);
Run Code Online (Sandbox Code Playgroud)
A和之间有什么区别B?
我的理解:
A是UB但是B可以,因为副作用++a将在作业之前完成.是对的吗?
更新:序列点之间++a和之间有什么区别a++?预增量(减量)的副作用可以在下一个seq点之前的任何时间完成,就像后增量(减量)一样?