C++语言笔记-2

使用书籍: A Tour of C++
作者: Bjarne Stroustrup (C++之父)

Chapter 4

  1. C++传值的方式传实参,即是type function_name(type parameter);实际上是把一份副本传递给函数,因此我们修改形参(副本)不会影响主调函数的实参,并且可以将结果作为返回值使用。

    如果不想使用拷贝,想直接使用源数据type function_name(type& parameter);,如果不改变源数据,还可再加上const前缀。

1
2
3
4
T a[n];     //T[n]: n个T组成的数组
T* p; //T*: 指向T的指针
T& r; //T&: T的引用
T func(A); //T(A): 是个返回T类型的函数,接受A类型的实参。
  1. switch-case只能判断常量(short, int, long, char)。
  2. C++存在对象new()方法,但是没有自动的内存清理机制,需要手动定义清理方法~class_name(){}实现delete()功能
  • 值传递:

    形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

    下面这里例子,证明给入参数是个栈中拷贝,且自动销毁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
class ObjectType {
private:
string _name;
public:
ObjectType(string name) {
_name = name;
cout << "Creating object " << _name << endl;
}
ObjectType() {
_name = "unnamed";
cout << "Creating object " << _name << endl;
}
~ObjectType() {
cout << "Destroying object " << _name << endl;
}
};
void func(ObjectType x) {
ObjectType y;
cout << "in func()" << endl;
}

int main() {
ObjectType o1;
ObjectType *o2p = new ObjectType("o2");
cout << "in main()" << endl;
func(o1);
return 0;
}
1
2
3
4
5
6
7
8
Creating object unnamed
Creating object o2
in main()
Creating object unnamed
in func()
Destroying object unnamed
Destroying object unnamed
Destroying object unnamed

还有其他2种调用方式:

  • 指针传递:

    形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

  • 引用传递:

    形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

Reference:

作者

Arthur LI

发布于

2017-08-09

更新于

2023-03-25

许可协议

评论