C++允许实例化类,通过初始化列表设置公共成员的值,如下面的b1示例所示
class B {
public:
int i;
std::string str;
};
B b1{ 42,"foo" };
B b2();
但是,如果我提供了一个构造函数
B(int k) { }
,它不会编译。
引擎盖后面是怎么回事?当不提供构造函数时,编译器会提供构造函数吗?但是它怎么能提供初始化列表呢?我认为它只会提供一个没有输入的“空白”构造函数,如b2的示例所示。还是两者兼而有之?
在C++中,如果我定义了一个复制构造函数和operator=来引用该类的非常量,编译器是否应该仍然提供常量引用的默认版本?
struct Test {
Test(Test &rhs);
Test &operator=(Test &rhs);
private:
// Do I still need to declare these to avoid automatic definitions?
Test(const Test &rhs);
Test &operator=(const Test &rhs);
};
最近我了解到,在C中有一些可以为空的:
int print();
int main() {
print("hallo"); // << valid but highly unintuitive
}
int print() {
}
在这段代码中,可能有人忘记了编写print(void) (可能是C++开发人员),但其他人提供了一个参数。编译不显示任何警告或错误:
$ make test -Wstrict-prototypes -Wimplicit -Wimplicit-function-declaration -Wall
cc test.
我知道这类问题被问了很多次,我读过关于它的不同答案,以及ISO标准的一些部分。
但是,我仍然需要对所期望的C++标准的确切行为做一些澄清。
假设这一点:
class A
{
public:
A( void ) {}
A( const A & a ) {}
};
class B: public A
{
public:
B( void ) {}
B( const B & b ) {}
};
我知道调用B类的复制构造函数不会调用A类的复制构造函数,我们可以使用初始化列表来正确地完成它。
我还知道如何
我正在学习C++。特别是声明和定义之间的区别。以我目前的理解
所有的定义都是声明,但并不是所有的声明都是定义。
下面是我目前所知道的一个例子。
int x; //definition(as well as declaration according to the above quote)
extern int y; //declaration that is not a definition
class CustomType
{
int x; //is this a "declaration that is not a definition" OR a "
每当我尝试编译时,都会收到此错误消息
Error 6 error LNK2019: unresolved external symbol "void __cdecl MergeSort(class LinkedList<int> &)" (?MergeSort@@YAXAAV?$LinkedList@H@@@Z) referenced in function _main C:\Users\FOla Yinka\Documents\Visual Studio 2012\Projects\C++\C++\linkedlist.obj C++
Err
我正在尝试编写非侵入性的boost::带有私有成员的嵌套类的序列化例程。不幸的是,我无法让g++相信序列化例程是内部类的朋友。g++似乎需要序列化例程的前向声明,而这又需要嵌套类的前向声明,而这又不能在C++中完成。我是不是漏掉了什么,还是这不可能?相反,clang++不需要前向声明,下面的代码也没有问题。下面的代码说明了这个问题:
#include <boost/archive/text_oarchive.hpp>
class Outer;
//class Outer::Inner; // Not valid C++
namespace boost
{
names
这段代码
#include <memory>
#include <vector>
class Foo
{
public:
~Foo()
{
}
std::unique_ptr<int> bar;
};
int main()
{
std::vector<Foo> foos;
foos.emplace_back();
}
在g++中产生以下错误消息:
In file included from /usr/include/c++/4.8/memory:64:0,
f
如何定义和声明一个函数,而不是,而不是,以C++形式接受任何通过值传递的参数。如下所示,应该返回一个错误:
#include <iostream>
using namespace std;
// function declaration
void swap(int &x, int &y);
int main () {
// local variable declaration:
int a = 100;
int b = 200;
cout << "Before swap, value of a :" <
我有一段代码,在其中我从库类中派生了一个类,其默认构造函数定义在库中。我没有定义任何默认构造函数,根据我的理解,C++编译器应该为我提供它,但我得到了错误
error: no matching function for call to 'derived::derived()'
compilation terminated due to -Wfatal-errors.
我的代码看起来像下面的代码片段
#include <iostream>
using namespace std;
class base
{
public :
base()
{
在这些c++示例中:
1. int operator+ ( Jazz &lhs,Jazz &rhs );
2. Jazz & Jazz operator= (const Jazz &);
3. Jazz & operator+ ( const Jazz & )
我理解c++中操作符重载背后的基本概念。我不知道的是:
在第二个示例中,是否需要在重载operator=之前声明和定义复制构造函数?
如何区分成员和非会员操作符超载?
第一个示例是非成员的,但是它可以访问类实例,并与它们一起工作?
第三个例子也是非会员的,但它的类型是爵士乐吗?
代码
我将问题简化为这个示例(粘贴为单个块以便于编译)
/// \brief The free-function template,
/// which is overloading a method with the same name in AbstractA below.
template <class T>
inline const T overloadedMethod(const T& lhs, const T& rhs)
{
return T(lhs.value+rhs.value);
}
/// \brief AbstractA class
我正在使用所列的C++书籍学习。特别是,我读到,从非空函数的末尾流出是未定义的行为。然后我看了的答案,上面写着:
在C++中,只要从值返回函数的末尾流出,返回函数总是未定义的行为(不管调用代码是否使用该函数的结果)。在C中,只有当调用代码尝试使用返回的值时,这才会导致未定义的行为。
但在的回答中,我读到:
在C/C++下,不从声称返回某项内容的函数返回是合法的。
正如您在第一个引用的答案中所看到的,用户说在C++中它总是UB,而第二个引用的答案说它是合法的。他们似乎互相矛盾。
以上哪个答案在C++中是正确的?
另外,我在C++中有以下示例:
int func(int a, in