假设我了解以下两种创建对象的方法,调用默认构造函数(由编译器提供)是正确的。
class A
{
int a,b;
//No programmer defined constructor
}
...
A o1; //Implicit Call I believe
A o2 = A(); //Explicit Call
为什么A o2 = A();导致对象o2的成员(a,b)用默认值(0)初始化自身,而不使用A o;(它们是用垃圾值初始化的)?这是未定义的行为吗?
在c++11中,您可以这样做:
class Foo
{
public:
Foo();
bool test = false;
};
Foo::Foo()
{
// is test guaranteed to be false now? and is it surely not overriden later?
this->test = true;
}
我想知道的基本上是在注释中描述的,我可以用我的编译器来验证这一点,但是这在标准中提到了吗?在所有平台和编译器上都是一样的吗?
查看Linkedlist.java,我观察到重载的构造函数,其中一个包含空的this()。通常,我在默认参数中看到过这种情况。这个()没有对角线有什么用呢?
/**
* Constructs an empty list.
*/
public LinkedList() {
}
/**
* Constructs a list containing the elements of the specified
* collection, in the order they are returned by the collection&
我有一个在向量中嵌套向量的问题,相当于C中的二维数组。我已经尝试了在许多网站上发布的演示代码,但都没有用。
class Board
{
public:
vector< vector<Cell> > boardVect; //Decalre the parent vector as a memebr of the Board class
Board()
{
boardVect(3, vector<Cell>(3)); //Populate the vector with
这是专门针对C++11的:
#include <iostream>
struct A {
A(){}
int i;
};
struct B : public A {
int j;
};
int main() {
B b = {};
std::cout << b.i << b.j << std::endl;
}
用g++ 8.2.1编译:
$ g++ -std=c++11 -pedantic-errors -Wuninitialized -O2 a.cpp
a.cpp: In function ‘int ma
我知道这类问题被问了很多次,我读过关于它的不同答案,以及ISO标准的一些部分。
但是,我仍然需要对所期望的C++标准的确切行为做一些澄清。
假设这一点:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{
public:
B( void ) {}
B( const B & b ) {}
};
我知道调用B类的复制构造函数不会调用A类的复制构造函数,我们可以使用初始化列表来正确地完成它。
我还知道如何
因此,我希望为我的派生类创建一个构造函数,并给出基类的一个实例,以便用输入参数初始化我的基类,并且我的派生类遵循默认构造函数。我想到了这个(MWE):
class Derived : public Base {
Derived(){a = 0; b=3;};
Derived(Base * base): Base(*base),Derived(){};
int a;
int b;
}
但是这给了我错误的error: constructor delegation follows mem-initializer for 'Base'
那我该怎么做?我知道一种工作方式,但我在问是否有更
我想知道为什么下面的代码不是用C++14编译的,而是用C++17编译的。当然,问题是A类的非const复制构造函数,我使用的是VS 2019年。这段代码有效吗?
class A {
public:
A() { }
A(A& a) { }
};
A fun() {
A a;
return a;
}
int main()
{
A a = fun();
}
来自编译器的消息:
constructorinitializing无法从A复制到A无法复制构造类A由于复制构造函数不明确或没有可用的复制构造函数
我正试图用c++11统一初始化来处理一些角落的情况,但我不明白为什么:
struct Base
{
int x,y,z;
};
struct Derived : Base
{
};
static_assert (std::is_trivial<Base>::value, "Base must be trivial");
static_assert (std::is_trivial<Derived>::value, "Derived must be trivial");
Base b{1, 2, 3}; //
为了帮助您理解这一点,我给出了我的代码:(main.cpp),只涉及一个文件。
#include <iostream>
#include <vector>
using namespace std;
class test{
public :
int member {0};
void fun(){cout << "member is " << member << endl;}
test(){}
//test(int param) : member(param){} //this line
考虑以下代码:
class A {
public:
int i;
A() {}
};
class B {
public:
A a;
int i;
};
int main() {
B* p = new B {};
std::cout << p->i << " " << p->a.i << "\n";
}
用-std=c++11在clang++中编译,p->i原来是零,但p->a.i不是。如果它的类没有用户提供的构造函数,那么不应该对整个对象进
我的一个类继承自我使用的框架中的类。超类在构造函数中调用一个方法,我在自己的类中重写该方法。该方法使用我希望在之前初始化的字段,超级构造函数将调用它以避免使用NullPointerException。
有办法这样做吗?
下面是一个合成测试场景,我希望在调用c时,Child中的call不为null。
public class Test {
public static class Parent {
public Parent() {
super();
call();
}
// only ca
我有一个函数返回模板类型的缺省构造值:
template<typename T>
T do_stuff()
{
return T();
}
我就是这样用的:
int main(int argc, char** argv)
{
std::string str("hello");
int a = 10;
int *p = &a;
str = do_stuff<std::string>();
a = do_stuff<int>();
p = do_stuff<int*>(
这个问题与相关。
正如我在上一个问题中提到的,我已经决定从Win structure BITMAP继承我的类,以提供一些扩展功能。
我注意到了编译程序行为的一些有趣的细节。首先,我为我的类定义了默认构造函数,如下所示:
CPreviewFrame::CPreviewFrame():
m_bufferSize( 0 )
{
bmBits = NULL; //ensure that compiler in debug won't init it with 0xccccc... and delete[] will do the job
}
在idea中,编译器必须生成调用基类型的
考虑以下代码段:
#include <iostream>
using std::cout;
using std::endl;
class A
{
public:
//constexpr A (){i = 0;}
constexpr A ():i(0){}
void show (void){cout << i << endl; return;}
private:
int i;
};
class B
{
public:
constexpr B(A a){t
我碰到了一件我觉得很奇怪的事:
#include <vector>
int numqueues = 1;
std::vector<float> priorities{numqueues, 1.f };
//^^^ warning: narrowing conversion of numqueues from int to float
//std::vector<float> priorities(numqueues, 1.f );
//^^^ No warning or error. And it's not because it's p
我尝试为成员使用值初始化,并为构造函数初始化值(我不知道我是否真的使用了好的术语.)
所以..。当我定义:
struct A
{
int a_;
};
我可以用:
A a{5};
assert(m.a_==5);
但是,如果我想使用成员大括号初始化程序和初始化列表构造函数。
struct B
{
int b_ {1};
};
这不编译(c++14:):
B b{2};
以下是错误:
prog.cpp:19:7: error: no matching function for call to 'B::B(<brace-enclosed initializer list
我是MFC编程的新手。这些天,我正在使用Jeff Prosise的书来学习MFC编程。我遇到过:CClientDC dc (this);和我从CClientDC类的定义中找到了一个构造函数:CClientDC(CWnd* pWnd);,但是如果我用CClientDC dc = CClientDC(this);替换CClientDC dc (this);。编译器告诉我这是个错误。我不能理解。我认为CClientDC dc (this);和CClientDC dc = CClientDC(this);是一样的。或者换句话说,前者是一种简单的形式。
非常感谢。