首页 > 代码库 > [C++] 变量、指针、引用作函数参数的区别

[C++] 变量、指针、引用作函数参数的区别

[cpp] view plaincopy
  1. //============================================================================  
  2. // Name        : CppLab.cpp  
  3. // Author      : sodino  
  4. // Version     :  
  5. // Copyright   : Your copyright notice  
  6. // Description : Hello World in C++, Ansi-style  
  7. //============================================================================  
  8.   
  9. #include <iostream>  
  10. #include <string>  
  11. using namespace std;  
  12.   
  13. struct Student{  
  14.     string name;  
  15. };  
  16.   
  17. int main() {  
  18.     void print(Student);  
  19.     void print_point(Student *);  
  20.     void print_reference(Student &);  
  21.     struct Student stu = {"Yao ming"};  
  22.     cout << "main &stu=" << &stu << endl << endl;  
  23.   
  24.     print(stu);  
  25.     cout << "after print() name=" << stu.name << " no changed."<< endl << endl;  
  26.   
  27.     print_point(&stu);  
  28.     cout << "after print_point() name=" << stu.name << " has been modified." << endl << endl;  
  29.   
  30.     print_reference(stu);  
  31.     cout << "after print_reference() name=" << stu.name << " has been modified." << endl;  
  32.     return 0;  
  33. }  
  34.   
  35. void print(Student stu) {  
  36.     // 实参转形参,会消耗额外的时间。print_reference()则效率高许多。  
  37.     cout << "print() stu address=" << &stu << " is different."<< endl; // 形参stu与函数体外的stu是两个不同的对象!!  
  38.     stu.name = "new.name"; // 这里的赋值并不会改变函数体外stu的name  
  39.     cout << "print() set new name=" << stu.name << endl;  
  40. }  
  41.   
  42. void print_point(Student * stu) {  
  43.     stu->name = "new.point.name";  
  44.     cout << "print_point() set new name=" << stu->name << endl;  
  45. }  
  46.   
  47. void print_reference(Student &stu) {  
  48.     stu.name = "new.reference.name";  
  49.     cout << "set new name=" << stu.name << endl;  
  50. }  
 
 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. main &stu=0x7fff5eabfbc8  
  2.   
  3. print() stu address=0x7fff5eabfba0 is different.  
  4. print() set new name=new.name  
  5. after print() name=Yao ming no changed.  
  6.   
  7. print_point() set new name=new.point.name  
  8. after print_point() name=new.point.name has been modified.  
  9.   
  10. set new name=new.reference.name  
  11. after print_reference() name=new.reference.name has been modified.  

print():用结构体变量作为实参和形参,简单明了,但在调用函数时形参要额外开辟内存,实参中全部内容通过值传递一一传给形参。造成空间和时间上的浪费。
print_point():指定亦是作为实参和形参,实参只是将stu的起始地址传给形参,而不是一一传递,也没有额外的内存开辟,效率高。但可读性可能不是很好。
print_reference():实参是结构体Student类型变量,而形参用该类型的引用,在执行函数期间,函数体操作的stu是函数体外的stu,可读性亦强。
 
C++中增设引用变量,提高效率的同时保持了高可读性。

 

[C++] 变量、指针、引用作函数参数的区别