相关疑难解决方法(0)

C++:类方法前面的"const"

以此方法声明为例:

const Vector Vector::operator - ( const Vector& other ) const;
Run Code Online (Sandbox Code Playgroud)

我知道第二个const使Vector作为参数传递为immutable,并且最后一个const声明该方法不会更改Vector类的当前实例....

  • 但是第一个const意味着什么或者导致什么呢?

c++

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

vector::push_back() 元素的生命周期

我想确认我对已push_back()在 .ed 上编辑的对象的生命周期的理解std::vector。我读到的内容是向量中的元素是副本。那么,下面的用法可以吗?具体来说,变量 s 是否位于f2()an 的不同实例中std::string,而不是push_back()'ed 中的变量f1(),因此可以安全使用?

void f1(std::vector<std::string>* pv) {
    std::string s = "hi";               
    pv->push_back(s);
}

void f2(void) {
    std::vector<std::string> v;
    f1(&v);
    for (size_t i = 0; i < v.size(); ++i) {
        std::string s = v.at(i);
        std::cout << s;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ stl

4
推荐指数
2
解决办法
3451
查看次数

C++:按值传递对象的原因

在Java中,包含适当对象的所有变量实际上都是引用(即指针).因此,使用这些对象作为参数的方法调用始终是"通过引用".调用修改对象状态的方法也会影响原始对象(在调用者端).

C++是不同的:这里的参数可以通过值传递或通过引用传递.在通过值传递的对象上调用mutator方法会使原始对象不受影响.(我想按值调用会创建对象的本地副本).

所以我对此的第一反应 - 从Java到C++ - 是:当使用对象作为参数时,总是使用指针.这给了我从Java期望的行为.

但是,如果一个人不需要修改方法体中的对象,也可以使用"按值调用".是否有人想要这样做?

c++ java oop

4
推荐指数
2
解决办法
1万
查看次数

如何将对象移动到未初始化的内存中?

给定已分配但未初始化的内存位置,如何将某个对象移动到该位置(销毁原始对象),而不构建可能昂贵的中间对象?

c++ move-semantics c++11

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

c ++ std :: move confusion

我对以下代码片段中发生的事情感到困惑.这move真的有必要吗?返回临时集的最佳+安全方法是什么?

set<string> getWords()
{
    set<string> words;

    for (auto iter = wordIndex.begin(); iter != wordIndex.end(); ++iter)
    {
        words.insert(iter->first);
    }

    return move(words);
}
Run Code Online (Sandbox Code Playgroud)

我的调用代码就是这样 set<string> words = foo.getWords()

c++ c++11

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

如何使用新语法

当我读一些文章时,我发现这条线是如此神秘.

new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)

有人可以解释这种语法是如何工作的吗?

c++

4
推荐指数
2
解决办法
260
查看次数

c ++移动语义澄清

我有一个包含std :: string的Text类.一个方法SetText如下:

void Text::SetText( const std::string& str )
{
    m_str = str;
}
Run Code Online (Sandbox Code Playgroud)

因为这个方法几乎总是以rvalues作为参数调用,所以我想到了移动构造函数.我理解基础知识,但这就是全部.所以我做了测试并得出结论,像这样的另一个函数会更好,一旦定义了移动构造函数和移动分配,就可以获得性能提升:

void Text::SetText( std::string&& str )
{
    m_str = move( str );
}
Run Code Online (Sandbox Code Playgroud)

有我的问题:

  • 它适用于标准容器吗?他们是否提供移动构造和分配?
  • 当没有堆分配时,移动语义是否有用?(我的意思是根本没有堆分配,所以没有智能指针作为类成员)

谢谢.

c++ c++11

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

C++ 具有整数成员的对象的移动语义

#include<iostream>
#include<stdio.h>

using namespace std;
class Test
{    
   public:
       string n;
       Test():n("test") {}  
};

int main()
{
    Test t1;  
    std::cout<<"before move"<<"\n";
    std::cout<<"t1.n=" << t1.n<<"\n";
    Test t2=std::move(t1);

    std::cout<<"after move"<<"\n";
    std::cout<<"t1.n="<<t1.n<<"\n";
    std::cout<<"t2.n="<<t2.n<<"\n"; 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出产生以下结果

移动前 t1.n=测试 移动后 t1.n= t2.n=测试

了解到,将对象 t1 移动到 t2 后,t2.n 的值结果为空字符串

但相同的概念移动概念不适用于整数。

#include<iostream>
#include<stdio.h>

using namespace std;

class Test
{

    public:
        int n;
        Test():n(5) {}  

};

int main()
{
    Test t1;  
     std::cout<<"before move"<<"\n";
     std::cout<<"t1.n=" << t1.n<<"\n";
     Test t2=std::move(t1);

     std::cout<<"after move"<<"\n";
     std::cout<<"t1.n="<<t1.n<<"\n";
     std::cout<<"t2.n="<<t2.n<<"\n"; 

     return 0;
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出产生以下结果 …

c++ constructor move c++11 semantics

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

C++ 11右值引用vs const引用

这可能是显而易见的,但我认为这对我来说很难.鉴于这种:

void test(std::string&&) { }

std::string x{"test"};
test(std::move(x)); // ok
Run Code Online (Sandbox Code Playgroud)

此代码test() 使用rvalue引用作为参数调用,以便程序按照我的预期进行编译.

现在看看这个:

void other_test(const std::string&) { }

std::string x{"test"};
other_test(std::move(x)); // ok???
Run Code Online (Sandbox Code Playgroud)

在这里,我倾斜了.为什么这个版本会编译?所述std::move返回一个&&类型; 为什么我在第二种方法中没有出现错误const&


我知道

int&& s = 5;
const int& s = 5;
Run Code Online (Sandbox Code Playgroud)

是有效的,因为在这两种情况下我提供的东西都没有左值,它没有地址.是&&const&相同呢?如果不是,有区别吗?

c++ c++11

4
推荐指数
3
解决办法
1180
查看次数

&amp;&amp; 对 lambda 表达式有什么好处?

我看到的代码如下:

template<class Function>
void MyFunc(Function&& function) { function(...); }
Run Code Online (Sandbox Code Playgroud)

&&与仅按值复制函数相比,这里的优势是什么?作为参考,我使用的是 C++14。

c++ lambda templates perfect-forwarding c++14

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