代做网站跳转,智能化建设网站,网站建立好如何做seo,wordpress换不了密码错误C中返回类型与return语句
有、无返回值的函数及其return语句 无返回值#xff08;函数声明中#xff0c;返回值类型为void#xff09;的函数#xff0c;如果其中没有任何return语句也是正确的#xff0c;编译器会自动在函数结束处补上隐式的return;语句。如果这种void函数…C中返回类型与return语句
有、无返回值的函数及其return语句 无返回值函数声明中返回值类型为void的函数如果其中没有任何return语句也是正确的编译器会自动在函数结束处补上隐式的return;语句。如果这种void函数内部出现显式的return;其作用是表示该函数在此处将控制权交还给主调函数。 除void函数外其他函数必须显式地返回与声明中返回值类型相同或可以转换为该类型的值。 函数把值返回给调用处的细节原理 函数把值返回给外部调用处的实现方法细节与从外部实参传递值给函数形参的方法细节完全一样。本质上是用已有值传参中的实参返回中的返回值初始化一个临时量传参中的形参返回中的函数调用点。因此对象的初始化规则在函数返回过程中仍然适用。
1 函数返回局部变量给外部 本质上是将函数内局部变量的值拷贝给函数调用点用来初始化外部调用点的临时对象。
2 函数返回引用给外部 引用是对象的别名因此此时函数对外返回的是对象本身而不是拷贝一个值给外部副本。因此要特别注意千万不能返回函数内部局部对象的引用和指针。因为函数在结束调用后局部变量就会被销毁这时被函数给返回到外部的局部变量对象引用将不再绑定有效的内存区域。
综上可知函数要想对外返回引用或指针只能返回那种在函数调用之前已经存在了的对象的引用或指向该对象的指针
范例
//函数对外返回引用的正确用法
const string shorterStr(const string s1, const string s2) { //挑出两个string对象中较短的那个返回其引用return s1.size() s2.size() ? s1 : s2; //因为s1和s2绑定的对象都是在调用函数前就已经存在的了因此函数对外返回这种对象的引用不会产生问题
}//以下写法严重错误这个函数试图返回局部对象的引用
const string manip() {string ret;if (!ret.empty()) {return ret; //❌试图返回局部对象的引用} else {return Empty; //❌Empty也是一个局部临时量并且以引用的方式传出在函数结束调用后该临时量会被销毁使得外部调用点的引用不再绑定具体对象}
}//以下写法严重错误不能返回一个指向局部对象的指针
int *funcIp(int var) {int i 10;int *ip (i var); //i var对象是一个临时量结束调用后销毁对外返回的指针无法指向确定的内存return ip;
}返回类类型的函数可以连续调用 返回类类型类的对象或其引用或指向类的对象的指针的函数可以在其调用处继续使用调用运算符去调用该类的其他函数如下例
const string shorterStr(const string s1, const string s2) { //此函数返回的是一个string对象的引用return s1.size() s2.size() ? s1 : s2;
}
string s1 aaaa;
string s2 bbb;
auto sz shorterStr(s1, s2).size(); //shoterStr(s1, s2)返回的是一个string对象s2该对象有size()成员函数因此可以在shoterStr()的返回处再继续调用size()这个调用结束后返回的是一个size_t类型值对象由auto类型对象sz接收引用返回左值 调用一个返回引用的函数在调用处得到左值左值可以放在赋值号左边用来被赋值 调用返回其他类型的函数在调用处得到右值右值可以放在赋值号右边用来赋值 可以像使用其他左值那样来使用返回左值返回引用的函数调用特别是能为返回类型是非常量引用的函数结果进行赋值。如下例 但如果函数的返回值类型是常量引用就不能给调用结果进行赋值了这是常量特性所决定的
char get_val(string str, string::size_type ix) { //该函数的返回值类型是非常量引用其返回结果可以在调用处被当作左值return str[ix]; //假定索引值ix一定合法
}const string shorterStr(const string s1, const string s2) { //此函数返回的是常量引用return s1.size() s2.size() ? s1 : s2;
}int main() {string s(a value);cout s endl; //输出a valueget_val(s, 0) A; //get_val的返回结果在此处被当作左值因为它的返回值类型是非常量引用可以完成这里的赋值操作将s[0]的值改为Acout s endl; //输出A valueshoterStr(hi, bye) X; //❌返回的是常量引用也就是常量对象不能被修改因此也不能这样作为左值使用return 0;
}该文章会更新欢迎大家批评指正。
推荐一个零声学院的C服务器开发课程个人觉得老师讲得不错 分享给大家LinuxNginxZeroMQMySQLRedis fastdfsMongoDBZK流媒体CDNP2PK8SDocker TCP/IP协程DPDK等技术内容 点击立即学习C/C后台高级服务器课程