[C++] 變數、指標、引用作函數參數的區別,指標函數
//============================================================================// Name : CppLab.cpp// Author : sodino// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>#include <string>using namespace std;struct Student{string name;};int main() {void print(Student);void print_point(Student *);void print_reference(Student &);struct Student stu = {"Yao ming"};cout << "main &stu=" << &stu << endl << endl;print(stu);cout << "after print() name=" << stu.name << " no changed."<< endl << endl;print_point(&stu);cout << "after print_point() name=" << stu.name << " has been modified." << endl << endl;print_reference(stu);cout << "after print_reference() name=" << stu.name << " has been modified." << endl;return 0;}void print(Student stu) {// 實參轉形參,會消耗額外的時間。print_reference()則效率高許多。cout << "print() stu address=" << &stu << " is different."<< endl; // 形參stu與函數體外的stu是兩個不同的對象!!stu.name = "new.name"; // 這裡的賦值並不會改變函數體外stu的namecout << "print() set new name=" << stu.name << endl;}void print_point(Student * stu) {stu->name = "new.point.name";cout << "print_point() set new name=" << stu->name << endl;}void print_reference(Student &stu) {stu.name = "new.reference.name";cout << "set new name=" << stu.name << endl;}
main &stu=0x7fff5eabfbc8print() stu address=0x7fff5eabfba0 is different.print() set new name=new.nameafter print() name=Yao ming no changed.print_point() set new name=new.point.nameafter print_point() name=new.point.name has been modified.set new name=new.reference.nameafter print_reference() name=new.reference.name has been modified.
print():用結構體變數作為實參和形參,簡單明了,但在調用函數時
形參要額外開闢記憶體,實參中全部內容通過值傳遞一一傳給形參。造成空間和時間上的浪費。print_point():指定亦是作為實參和形參,實參只是將stu的起始地址傳給形參,而不是一一傳遞,也沒有額外的記憶體開闢,效率高。但可讀性可能不是很好。print_reference():實參是結構體Student類型變數,而形參用該類型的引用,在執行函數期間,函數體操作的stu是函數體外的stu,可讀性亦強。
C++中增設引用變數,提高效率的同時保持了高可讀性。