提问人: 提问时间:11/9/2015 最后编辑:p.i.g. 更新时间:11/10/2015 访问量:1896
C++ 构造函数 -- 通过引用传递仅适用于 const。为什么?
C++ Constructor -- pass by reference only works with const. Why?
问:
所以今天早些时候,我正在赶上旧的C++,当我编译我的代码时,它不起作用。像一些程序员一样,我开始四处寻找,最终发现添加键盘可以解决这个问题。但是,我不太喜欢黑客攻击,并想知道为什么代码在添加 .const
const
这是我在将 添加到构造函数之前的代码:const
#include <iostream>
#include <string>
using namespace std;
class Names {
private:
string _name;
string _surname;
public:
Names(string &name, string &surname) : _name(name), _surname(surname) {}
string getName() const {return _name;}
string getSurname() const {return _surname;}
};
int main(){
Names names("Mike", "Man");
cout << names.getName() << endl;
cout << names.getSurname() << endl;
}
我收到这些错误:
names.cc:19:27: error: no matching function for call to ‘Names::Names(const char [5], const char [4])’
Names names("Mike", "Man");
^
names.cc:19:27: note: candidates are:
names.cc:11:2: note: Names::Names(std::string&, std::string&)
Names(string &name, string &surname) : _name(name), _surname(surname) {}
^
names.cc:11:2: note: no known conversion for argument 1 from ‘const char [5]’ to ‘std::string& {aka std::basic_string<char>&}’
names.cc:5:7: note: Names::Names(const Names&)
class Names {
^
names.cc:5:7: note: candidate expects 1 argument, 2 provided
<builtin>: recipe for target 'names' failed
make: *** [names] Error 1
但是,在构造函数中添加关键字后 - 它似乎正在工作。const
Names(string const &name, string const &surname) : _name(name), _surname(surname) {}
这是我的工作代码:
#include <iostream>
#include <string>
using namespace std;
class Names {
private:
string _name;
string _surname;
public:
Names(string const &name, string const &surname) : _name(name), _surname(surname) {}
string getName() const {return _name;}
string getSurname() const {return _surname;}
};
int main(){
Names names("Mike", "Man");
cout << names.getName() << endl;
cout << names.getSurname() << endl;
}
现在,几个问题:
- 为什么代码在没有 for pass by 的情况下无法正常工作
参考?在您的
构造函数,如果是这样,这是否意味着我们必须使用关键字?
const
const
- 因此,如果我在构造函数中按值传递,请说:这是否意味着 and 是 null 还是它们
传递的值。我知道在传递值中,变量的副本
正在制作中,并且正在对副本进行更改。但是什么时候
副本被删除或超出范围?这有点令人困惑。
Names(string name, string surname) : _name(name), _surname(surname) {}
_name
_surname
谢谢
答:
字符串文字必须转换为 ,这将是临时的,并且不能通过非常量引用传递临时文本。std::string
评论
"a string literal like this"
std::string
const
1- 对构造函数的调用中的“Mike”和“Man”是临时的,非常量引用不能绑定到临时引用。 按值传递内置类型更有效,所有其他对象按常量引用传递效率更高。
2- 如果您按值传递并将具有传递的值。传递的参数副本是函数的本地副本,因此当构造函数超出范围时,它们将被销毁。_name
_surname
很难在@CoryKramer的解释中添加一些东西
字符串文本必须转换为 std::string,这将是 一个临时的,你不能通过非常量引用传递一个临时的。
这不仅仅是重新表述它。
无论如何,这里有一些你(@CodeMan)可以使用的检测代码
#include <iostream>
std::ostream& logger = std::clog;
struct A {
A() = delete;
A(int ii) : i(ii) {logger << "A(int) ctor\n";}
A(const A& a) : i(a.i) {logger << "A copy ctor\n";}
A& operator= (const A& a) { i = a.i; logger << "A copy assigment\n"; return *this;};
// nothing to steal here
A(A&& a) : i(a.i) {logger << "A move ctor\n";}
A& operator= (A&& a) {i = a.i; logger << "A move assigment\n"; return *this;};
~A() {logger << "A dtor\n";}
int i;
};
void foobar(const A& a) {
logger << "foobaring const A&\n";
}
void foobar(A& a) {
logger << "foobaring A&\n";
}
int main(){
int i(42);
A a(i);
logger << "ctored a\n===================\n";
foobar(a);
logger << "foobared a\n-------------------\n";
foobar(i);
logger << "foobared " << i << "\n===================" << std::endl;
}
住在 Coliru's。
从输出中可以看出
[...]
===================
foobaring A&
foobared a
-------------------
A(int) ctor
foobaring const A&
A dtor
foobared 42
===================
[...]
在第二次调用中,隐式地从该 int 参数中隐式地传递了一个临时实例,并且该临时实例被传递到另一个实例中,即 的 const 版本,因此作为 .foobar
A
A
foobar
const A &
你也可以,在第二个回来之后,那个临时的被扣留了。foobar
A
上一个:按值或引用传递容器
评论
std::string