考虑以下代码:
#include <type_traits>
template<typename T>
struct A1 {
T t;
// implicitly-declared default constructor
};
template<typename T>
struct A2 {
T t;
// explicitly-declared default constructor without noexcept
A2() = default;
};
template<typename T>
struct A3 {
T t;
// explicitly-declared default constructor with noexcept
A3() noexcept(std::is_nothrow_default_constructible<T>::value) = default;
};
Run Code Online (Sandbox Code Playgroud)
这三个默认构造函数在 C++ 中等效吗?
为什么单个参数构造函数std::list<T>需要T是一个默认可构造类型?我的意思是以下代码无法编译.
struct Foo { // does not have default constructor.
Foo (int i) {}
}
int main(void) {
std::list<Foo> l(10);
}
Run Code Online (Sandbox Code Playgroud)
似乎可以使用构造并销毁习惯用法,因为它们已经在std :: vector中完成了,尽管有更多的书籍保持列表类.
在相关的说明中,为什么没有列表中的容量功能?您可以争辩说,这样的函数会预先支付内存分配成本,并在您push_back反对时消除开销.至少它会使两个STL序列容器的接口稍微更一致.
我只想在这里清除我的概念,所以我要问......
如果我为我的类定义一个显式的参数化构造函数,我是否仍然可以调用java编译器提供的默认构造函数(默认情况下为每个类提供)?
或者它是否导致在这种情况下导致编译时错误?请解释一下编译器调用的确切情况!
可能重复:
Java默认构造函数
我正在研究Java实践问题,并且遇到了这个问题:
鉴于:
class X {}
class Y {Y () {}}
class Z {z(int i ) {} }
Run Code Online (Sandbox Code Playgroud)
哪个类有默认构造函数?
仅A. X.
B.仅限Y.
C.仅限Z.
D. X和Y.
E. Y和Z.
F. X和Z.
G. X,Y和Z.
我会说正确的答案是A,因为类X是唯一没有任何明确定义的构造函数的类.我的同行说它会是G,因为构成默认构造函数的是你在构造函数体中实际更改值的时候.
我们已经完成了一些研究,当涉及到默认构造函数实际上是什么(在这个级别)时,答案似乎有所不同.
任何人都可以在这里提供答案和逻辑解释吗?非常感谢你.
我在教科书中看到了这一点,但这本书没有解释它实际上做了什么,以及为什么我应该这样做.这与本书中的示例类似:
class MyClass
{
public:
MyClass(int initial_capacity = 20);
private:
int capacity;
}
Run Code Online (Sandbox Code Playgroud)
我不能initial_capacity在实现中使用,我甚至无法实现任何东西,所以我很困惑这是为了什么?是否以某种方式将容量设置为20?这是一个默认的构造函数?
我知道在创建类的对象时,构造函数会构建该对象.说我有这两个类:
class Vehicle {
public int a = func();
public int func() {
System.out.println("9");
return 9;
}
}
class Car extends Vehicle {
public static void main(String[] args) {
Car c = new Car();
}
}
Run Code Online (Sandbox Code Playgroud)
该项目的输出为"9".但为什么会这样呢?调用Car构造函数时到底发生了什么?我知道有一些类型的默认构造函数,但我不确定它是如何工作的.
有谁可以用上面的例子解释我的对象构造?
我们的教授在网上发布了一个自定义的"String"模板文件,并在不久前问我们填写下面的功能.我的问题是,为了尝试理解这一点,这就是为什么排名前三的构造函数Text = NULL;在其下面,以及它的this = source;其他形式.我觉得每个人都应该说Text = the_input_parameter.
非常感谢,这是代码:
class String
{
public:
// Default constructor
String()
{
Text = NULL;
}
String(const String& source)
{
Text = NULL;
// Call the assignment operator to perform deep copy
*this = source;
}
String(const char* text)
{
Text = NULL;
// Call the assignment operator to perform deep copy
*this = text;
}
~String()
{
delete[] Text;
}
// Assignment operator to perform deep copy
String& …Run Code Online (Sandbox Code Playgroud) 我构建了一个包含没有默认构造函数的向量的类.特别:
template<typename T>
struct MyVector
{
public:
int GetN(void)
{
return n;
}
MyVector(int n1)
{
n=n1;
ListElt = new T[n1];
}
~MyVector()
{
delete [] ListElt;
}
// some other irrelevant to the question code
private:
int n;
T *ListElt;
};
Run Code Online (Sandbox Code Playgroud)
现在我想构建一个派生自它的类,它包含一个整数和一个向量.有效的代码如下:
struct EquivInfo {
public:
EquivInfo(int inpOrbit, MyVector<int> &inpMat)
{
iOrbit=inpOrbit;
eVect=new MyVector<int>(inpMat.getN());
// some code for copying the vector in place.
}
~EquivInfo()
{
delete eVect;
}
private:
int iOrbit;
MyVector<int> *eVect;
};
Run Code Online (Sandbox Code Playgroud)
有没有办法避免使用向量的指针?
问题是如果我删除指针然后调用MyVector()类型的构造函数.我不懂为什么.应该有一种方法可以让EquivInfo的构造函数为MyVector调用一个精确的构造 …
当我们有一个这样的类没有任何构造函数时:
public class F {
public void sum() {
System.out.println("print it");
}
Run Code Online (Sandbox Code Playgroud)
该main方法如何创建此类的对象?对象是否已经有构造函数?
public static void main(String[] args) {
F obj = new F();
obj.sum();
}
}
Run Code Online (Sandbox Code Playgroud)
Java是否有像这样的默认构造函数:
public class F() {
}
Run Code Online (Sandbox Code Playgroud) 特别是在自动调用基类构造函数的上下文中:具有默认值的基类的单个参数构造函数是否与默认构造函数(不带参数的构造函数)以相同的方式(例如,如果未指定,则自动调用)?
struct base {
base(int value = 42) {}
};
struct derived : public base {
derived() {} // automatic call to base::base(int) ?
};
Run Code Online (Sandbox Code Playgroud)
编辑:以下与问题无关,这只是我如何想到的。以下代码甚至不显示我所看到的崩溃。请参阅下面的实际示例。
考虑一下:
#include <sstream>
// C++98, std::ostringstream(ios_base::openmode mode = ios_base::out) available
struct OhNo : public std::ostringstream {
OhNo() {
}
void Crash() const {
this->str();
}
};
// later: OhNo f; f.Crash();
Run Code Online (Sandbox Code Playgroud)
std::ostringstream(在C ++ 11之前)没有无参构造函数。只有一个具有单个参数和默认值。 上面(是的)确实存在,如果没有可用的自变量构造函数,则会自动调用基类构造函数。OhNo没有调用它的基类的构造函数。
GCC 5.4.0可以很好地进行编译,但是以后会出现段错误(由于未初始化的基类,这是 另一个问题)。Clang 7.0.0也可以很好地编译,并且可以正常运行代码。
谁是对的?是否需要在此处手动调用基类构造函数? …
c++ default-constructor language-lawyer default-arguments c++98