相关疑难解决方法(0)

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?他们意味着什么?

它们会在什么情况下发生?有什么限制?

c++ optimization c++-faq return-value-optimization copy-elision

350
推荐指数
4
解决办法
7万
查看次数

复制初始化和直接初始化之间有区别吗?

假设我有这个功能:

void my_test()
{
    A a1 = A_factory_func();
    A a2(A_factory_func());

    double b1 = 0.5;
    double b2(0.5);

    A c1;
    A c2 = A();
    A c3(A());
}
Run Code Online (Sandbox Code Playgroud)

在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?

我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.

c++ initialization

230
推荐指数
5
解决办法
5万
查看次数

为什么C++允许我们在声明变量时用括号括起变量名?

例如,声明如下:

int (x) = 0;
Run Code Online (Sandbox Code Playgroud)

甚至是:

int (((x))) = 0;
Run Code Online (Sandbox Code Playgroud)

我偶然发现了这一点,因为在我的代码中我碰巧有一个类似于下面的片段:

struct B
{
};

struct C
{
  C (B *) {}
  void f () {};
};

int main()
{
  B *y;
  C (y);
}
Run Code Online (Sandbox Code Playgroud)

显然,我想构造一个对象C,然后在它的析构函数中做一些有用的东西.但是,当它发生时,编译器将其C (y);视为y带有类型的变量声明,C因此它会输出有关y重新定义的错误.有趣的是,如果我把它写成C (y).f ()或类似的东西C (static_cast<B*> (y))将按预期编译.当然,最好的现代解决方法是{}在构造函数调用中使用.

因此,当我在那之后发现,可以声明变量之类的int (x) = 0;甚至是,int (((x))) = 0;但我从未见过任何人实际使用这样的声明.所以我很感兴趣 - 这种可能性的目的是什么,因为现在我看到它只创造了类似于臭名昭着的"最令人烦恼的解析"的情况,并没有添加任何有用的东西?

c++ most-vexing-parse

81
推荐指数
2
解决办法
4725
查看次数

隐式VS显式转换

Nicolai M. Josuttis的C++标准库声明:

两者之间存在细微差别

X x;
Y y(x) //explicit conversion
Run Code Online (Sandbox Code Playgroud)

X x;
Y y = x; //implicit conversion
Run Code Online (Sandbox Code Playgroud)

接下来说:"前者通过使用类型X的显式转换创建Y类型的新对象,而后者通过使用隐式转换创建类型为Y的新对象."

我猜对于显式与隐式转换的概念我有点困惑.在这两种情况下,你都使用X并将其推入Y本身 - 一个使用Y的构造函数,一个使用赋值运算符.

在这两种情况下如何处理转换有什么不同,是什么使它显式/隐式,以及如何使用"显式"关键字定义类构造函数(如果有的话)?

c++ type-conversion

18
推荐指数
1
解决办法
3万
查看次数

C++实例初始化语法

鉴于这样的类:

class Foo {
public:
    Foo(int);

    Foo(const Foo&);

    Foo& operator=(int);

private:
    // ...
};
Run Code Online (Sandbox Code Playgroud)

这两条线是完全相同的,还是它们之间有细微差别?

Foo f(42);

Foo f = 42;
Run Code Online (Sandbox Code Playgroud)

编辑:通过在原始问题中使Foo构造函数"显式",我感到困惑.我删除了,但欣赏答案.

我还添加了一个复制构造函数的声明,以明确复制可能不是一个简单的操作.

我真正想知道的是,根据C++标准,"Foo f = 42"会直接调用Foo(int)构造函数,还是会调用复制构造函数?

看起来fasih.ahmed有我正在寻找的答案(除非它是错的).

c++ initialization

11
推荐指数
2
解决办法
9259
查看次数

C++变量声明和初始化规则

请考虑以下声明和初始化类型变量的方法C:

C c1;

C c2;
c2 = C();

C c3(C());

C c4 = C();
Run Code Online (Sandbox Code Playgroud)

所有这些都完全相同,或者根据确切的定义,其中一些是否有所不同C?(假设它有公共默认值和复制构造函数).

c++ initialization declaration

3
推荐指数
1
解决办法
2343
查看次数

在 C++ 中初始化变量的 = 和 {} 语法之间的区别

我已经阅读了很多 C++ 代码,并且遇到了两种初始化变量的方法。

方法一:

int score = 0;
Run Code Online (Sandbox Code Playgroud)

方法二:

int score {};
Run Code Online (Sandbox Code Playgroud)

我知道这int score {};会将分数初始化为 0,所以也会int score = 0;

这两者有什么区别?我已经阅读了初始化:括号与等号,但这并没有回答我的问题。我想知道等号大括号之间有什么区别,而不是括号。在什么情况下应该使用哪一个?

c++ initialization c++11

1
推荐指数
1
解决办法
414
查看次数

输出上的随机数

我是C++的初学者,目前我正在学习如何做功能.最近我收到了以下练习:

#include <iostream> 
#include <string> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    int a,sum=0; 
    cout<<"Enter a number:"; 
    cin>>a; 

    int func(int x);
    sum=func (a );

    cout<<"\n"<<sum;
}

int func(int a)
{
    int x;
    for (int i=0; i<=a; i++)
    {
        x+=i;   
    }
    return x;      
} 
Run Code Online (Sandbox Code Playgroud)

我已经提前给了代码的int主要部分,我需要做的是完成int func部分,以便代码正确执行.如果我运行此代码,我只会得到一些随机数.什么是func应该做的是返回由用户估算数量的限制所有自然数的总和.你能告诉我如何更改这段代码才能正常工作?感谢您的任何反馈!

c++ function

0
推荐指数
1
解决办法
96
查看次数

为什么const char INITIAL ='G'不是赋值语句?

我在理解这个陈述时遇到了问题.我不知道为什么这和其他人不一样.

c c++ initialization variable-assignment

-3
推荐指数
1
解决办法
113
查看次数