有没有办法让一个零大小的类型只能隐式构造?
用例是通过大括号语法来防止结构的某些公共成员被初始化:
class Barrier { ... };
struct Foo {
int user_sets;
int* this_to;
Barrier _bar;
int *must_be_zero_init_by_linker;
};
Foo foo = {1}; // ok
Foo bar = {1, nullptr}; // ok
Foo baz = {1, nullptr, {}}; // must error
Run Code Online (Sandbox Code Playgroud)
编辑:另一个约束:Foo对象必须是链接器初始化的,因此它不能定义构造函数或私有成员.
我的问题是最后的陈述,即之前的陈述 return 0;
当我们尝试将int值分配给对象时,为什么要调用参数化构造函数.
我的代码:
#include<iostream>
using namespace std;
class Test {
private:
int i;
public:
Test(int s=0):i(s) {
cout<<"param ctor: "<<i<<endl;
}
};
int main()
{
Test a; //param ctor called
Test b(5); //param ctor called
//b(a); //error as we have not implemented copy ctor
b=a; //compiler provided assignment opr. called
b=100; //why param ctor called for this.??
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
param ctor: 0
param ctor: 5
param ctor: 100
Run Code Online (Sandbox Code Playgroud) 大多数人在用 C++ 或大多数其他语言声明字符串时,都会这样做:
std::string example = "example";
Run Code Online (Sandbox Code Playgroud)
但是我见过一些代码示例,其完成方式如下:
std::string example("example");
Run Code Online (Sandbox Code Playgroud)
对我来说,它似乎不必要地混淆了代码,特别是如果using std::string代码中的声明上方隐藏着一条语句,使其看起来像
string example("example");
Run Code Online (Sandbox Code Playgroud)
对于一些可能是代码库新手或来自其他语言的人来说,它几乎看起来像是一个方法或函数。
使用构造函数而不是赋值运算符是否有任何实际或基于性能的原因,或者是否只是个人喜好?
#include <iostream>
#include <string>
using namespace std;
class Part{
public:
std::string spec;
Part(std::string str){
this->spec = str;
}
std::string getSpec(){
return spec;
}
};
class Car{
public:
Part getEngine();
Part getWheels();
Part getBody();
};
class Benz:public Car{
public:
Part getEngine(){
return Part("Benz Engine");
}
Part getWheels(){
return Part("Benz Wheels");
}
Part getBody(){
return Part("Benz Body");
}
};
class Audi:public Car{
public:
Part getEngine(){
return Part("Audi Engine");
}
Part getWheels(){
return Part("Audi Wheels");
}
Part getBody(){
return Part("Audi Body");
}
}; …Run Code Online (Sandbox Code Playgroud) 我正在尝试为一个赋值实现一个显式转换构造函数,我很困惑我需要做什么.我有一个包含单个元素的WordList,并且我要使这个构造函数显式,所以我不能这样做:
WordList myList;
list = 'i'; // error
Run Code Online (Sandbox Code Playgroud) 我是 C++ 11 的新手。我发现了显式构造函数这个术语。但是我没有找到关于显式构造函数的任何好的解释。您能解释一下在什么情况下我应该使用显式构造函数吗?
先感谢您。
可能重复:
C++中的explicit关键字是什么意思?
我不明白以下几点.如果我有:
class Stack{
explicit Stack(int size);
}
Run Code Online (Sandbox Code Playgroud)
没有关键字explicit我将被允许做:
Stack s;
s = 40;
Run Code Online (Sandbox Code Playgroud)
如果没有提供显式,为什么我会被允许这样做?是因为这是堆栈分配(没有构造函数),C++允许将任何内容分配给变量,除非explicit使用它?