定义一个函数

  • 函数中的传参是值传递,而不是地址传递,在函数中对参数进行修改,不会影响实参,详见下例 ```cpp

    include

using namespace std;

int sum(int num1,int num2){ num1 = num1 + 1; return num1 + num2; }

int main() { int num1 = 12; cout << sum(num1, 13) << endl; cout << num1 << endl;

  1. return 0;

}

  1. > 26
  2. > 12
  3. <a name="sSXbL"></a>
  4. ### 函数的声明
  5. 一般来说,函数在调用之前必须已经被声明,比如以下代码无法正常运行,主要就是sum这个方面没有在main方法执行之前被声明。
  6. ```cpp
  7. #include <iostream>
  8. using namespace std;
  9. int main()
  10. {
  11. cout << sum(1, 2) << endl;
  12. return 0;
  13. }
  14. int sum(int num1,int num2){
  15. return num1 + num2;
  16. }

error: ‘sum’ was not declared in this scope

方案一:

  1. #include <iostream>
  2. using namespace std;
  3. //将要调用的方法移动到main方法之前
  4. int sum(int num1,int num2){
  5. return num1 + num2;
  6. }
  7. int main()
  8. {
  9. cout << sum(1, 2) << endl;
  10. return 0;
  11. }

方案二:

  1. #include <iostream>
  2. using namespace std;
  3. int sum(int num1, int num2);//先向编译器声明该方法
  4. int main()
  5. {
  6. cout << sum(1, 2) << endl;
  7. return 0;
  8. }
  9. int sum(int num1,int num2){
  10. return num1 + num2;
  11. }

头文件

当项目的规模变大以后,我们就开始考虑解耦,比如上边的sum方法我们将他独立出去,这时候就用到了头文件,即以.h为后缀名的文件

  • sum.h ```cpp

    include

    using namespace std;

int sum(int num1, int num2);

  1. 注:头文件中仅声明方法,但并不定义(当然也可以直接在这里定义,舍弃sum.cpp
  2. - sum.cpp
  3. ```cpp
  4. # include "sum.h"
  5. int sum(int num1,int num2){
  6. return num1 + num2;
  7. }
  • main ```java

    include

    include “sum.h”

using namespace std;

int main() { cout << sum(1, 2) << endl; return 0; }

  1. 注:在VSCode中,编译器可能无法将sum.hsum.cpp关联起来,我们也可以把main文件里的sum.h修改为sum.cpp就可以正常运行了。
  2. <a name="BGKQQ"></a>
  3. ###
  4. <a name="CtF8T"></a>
  5. ### 指针传递、值传递,引用传递
  6. <a name="ReGeK"></a>
  7. #### 值传递
  8. ```c
  9. #include <iostream>
  10. using namespace std;
  11. int sum(int num1,int num2){
  12. return num1 + num2;
  13. }
  14. int main()
  15. {
  16. cout << sum(1, 2) << endl;
  17. return 0;
  18. }

值传递的作用在于拷贝一份变量然后传给函数,在函数中进行修改并不会对实参造成影响,但拷贝本身不如指针/引用传递高效,一般C++推荐用常量引用替代值传递,一般方面调用语法不如指针复杂,效率和指针一样高:

常量引用替代值传递

  1. #include <iostream>
  2. using namespace std;
  3. int sum(const int& num1,const int& num2){
  4. return num1 + num2;
  5. }
  6. int main()
  7. {
  8. cout << sum(1, 2) << endl;
  9. return 0;
  10. }

指针传递

  1. #include <iostream>
  2. using namespace std;
  3. void add(int* num1){
  4. *num1 = *num1+1;
  5. return;
  6. }
  7. int main()
  8. {
  9. int num = 20;
  10. add(&num);
  11. cout << num << endl;
  12. return 0;
  13. }

引用替代指针传递

  1. #include <iostream>
  2. using namespace std;
  3. void add(int& num1){
  4. num1++;
  5. return;
  6. }
  7. int main()
  8. {
  9. int num = 20;
  10. add(num);
  11. cout << num << endl;
  12. return 0;
  13. }

注:可以看到语法相对简单了很多,不用重复做取值/取地址的操作

常函数

在函数上加上const关键字,可以将该函数设置为常函数,常函数的特点是该函数内不能修改除了mutable以外的任何变量。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class People{
  5. private:
  6. mutable int age;
  7. string name;
  8. public:
  9. People(string name,int age){
  10. this->age = age;//this是一个指针,代表当前的对象
  11. }
  12. /**
  13. * println()函数加上const,所以是常函数,不能修改非mutable的参数,否则编译器会报错
  14. **/
  15. void println() const{
  16. age = 30;//age加上了mutable属性所以可以修改,但如果想改name,会无法编译
  17. cout <<"姓名:" <<name<< "年龄:" << age << endl;
  18. }
  19. };
  20. int main()
  21. {
  22. People p("小明", 20);
  23. p.println();
  24. return 0;
  25. }