C++ Primer阅读笔记--参数传递

目录

1--三种基本传递方式

2--数组形参

3--main函数传递参数

4--传递可变形参


1--三种基本传递方式

① 值传递:

        使用值传递时,初始值会拷贝给变量,对变量的改动不会改变初始值的值;

② 指针传递:

        使用指针传递时,同样会发生拷贝操作,拷贝的内容是指针的值;拷贝之后,初始指针和拷贝指针是两个不同的指针,这两个指针都能修改所指对象的值,因此指针传递可以修改初始值;

③ 引用传递:

扫描二维码关注公众号,回复: 14953655 查看本文章

        使用引用传递时,不会发生拷贝操作,形参相当于初始变量的一个别名,修改形参会修改初始值;

        一般建议使用引用传递进行参数传递,避免不必要的拷贝花销;        

        当函数无须改变引用形参的值时,一般将其声明为常量引用

2--数组形参

        数组具有两个特殊的性质:不允许拷贝数组使用数组时会将其转换为指针;因此在函数中传递一个数组时,实际上传递的是指向数组首元素的指针

3--main函数传递参数

// 方式1
int main(int argc, char *argv[]){...}
// 方式2
int main(int argc, char **argv){...}

        上述两个方式功能等价,第一个形参 argc 表示数组中字符串的数量,第二个形参 argv 表示一个数组,其元素是指向 C 风格字符串的指针;其中 argv[0] 表示程序的名称;

4--传递可变形参

        C++11 新标准提供两种方法处理不同数量实参的函数,第一种是使用 initiallizer list 的标准库类型,其适用于不同数量但类型相同的实参传递;第二种是编写可变参数模板,用于处理不同数量且类型不同的实参传递;

#include <iostream>

// 打印输入的参数列表,其元素类型为 string 类型
void errorPrint(std::initializer_list<std::string> lst)
{
    for(auto beg=lst.begin();beg!=lst.end();++beg){
        std::cout << *beg << " ";
    }
    std::cout << std::endl;
}

void test()
{
    std::string s1, s2;
    std::cout << "Input s1: " << std::endl;
    std::getline(std::cin, s1);
    std::cout << "Input s2: " << std::endl;
    std::getline(std::cin, s2);
    if(s1 != s2){
        errorPrint({"functionX", s1, s2}); // 当 s1 != s2时,将打印输入的所有参数 
    }
    else{
        errorPrint({"functionX", "okay"}); // 传入 2 个参数
    }
}

int main(int argc, int *argv[]){
    test();
}

猜你喜欢

转载自blog.csdn.net/weixin_43863869/article/details/130496218