专业的企业级cms建站系统,网站设计师证书,wdcp 网站建设,网站404怎么做的1、为啥使用引用#xff1f;
// An highlighted block
void function(string str)
{... ...
}看上面这段代码#xff0c;如果不采用引用的方法#xff0c;那么在函数被调用的时候#xff0c;编译器会有一个参数赋值的过程#xff0c;这就导致了内存和效率的浪费。
// An…1、为啥使用引用
// An highlighted block
void function(string str)
{... ...
}看上面这段代码如果不采用引用的方法那么在函数被调用的时候编译器会有一个参数赋值的过程这就导致了内存和效率的浪费。
// An highlighted block
void main()
{string ch abc;function(ch);
}编译器暗中会执行string str ch这句导致效率和内存的浪费为了解决这个问题C11采用了引用的方法减少内存的浪费。
2、有了左值引用为啥要加入右值引用
// An highlighted block
void function(string str)
{... ...
}比如上面这个函数成功的解决了内存浪费的问题。但是有个新的问题这个函数没法传入一个右值。什么是左值和右值见收藏里的《一文读懂C右值引用和std::move》能取的就是左值不能的就是右值。
// An highlighted block
void main()
{function(abc);//编译不过
}因为abc是一个右值左值引用只能接受左值所以报错。但是在日常使用中我们非常希望能直接进行以上的编码。左值引用要能接受右值只需要加const就行了。
// An highlighted block
void function(const string str)
{... ...
}但这又会出现一个新的问题没法修改str的值如果function需要对str进行修改就出错了。为了解决这个问题C11引入了右值引用。
3、右值引用
为了解决上面提到的问题function的代码调整为以下代码
// An highlighted block
void function(string str)
{... ...
}右值引用只能接受右值不能接受左值。
// An highlighted block
void main()
{string ch abc;function(ch);//编译不过
}但是我们希望同时能传入一个左值过去怎么办这就引出了移动函数move()这个函数的功能是传入一个左值返回一个右值即右值引用接受左值的方法。
// An highlighted block
void main()
{string ch abc;function(move(ch));//编译通过
}4、移动构造
上面的代码中编译器暗中会执行string str move(ch)这句但是这一句会触发string的移动构造函数
// An highlighted block
class string
{
public:char* str;... ...string(string s) : str(s.str){s.str new char[1];s.str[0] 0;}... ...
};可以看到移动构造函数把参数s的内存清理了值却给了自己。