cpp primer笔记030-参数传递

这篇具有很好参考价值的文章主要介绍了cpp primer笔记030-参数传递。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. CPP允许将变量定义成数组的引用
    void print(int(&arr)[10])
    {
    	for (auto elem : arr)
    	{
    		std::cout << elem << std::endl;
    	}
    }
    
  2. CPP的initializer_list允许构建一个类似于CS的param数组,但是要求数组类型相同
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    template<typename Type>
    void print(std::string, std::initializer_list<Type> list)
    {
    	std::initializer_list<int> lst1{ 1,2,3 };
    	std::initializer_list<int> lst2(lst1);
    	lst2 = lst1;
    	std::cout << lst1.size() << std::endl;
    	for (std::initializer_list<Type>::iterator it = list.begin()
    		it != list.end(); ++it)
    	{
    		std::cout << *it << " ";
    	}
    	std::cout << std::endl;
    }
    int main()
    {
    	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    	print("sdfsdf", { 2, 3, 4, 5, 6 });
    	//print({ 2.0,3,4.0 }); X
    	return 0;
    }
    
  3. CPP可以用列表初始化返回值。
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    std::vector<std::string>process(const std::string& expected, const std::string& actual)
    {
    	if (expected.empty())
    		return {};
    	else if (expected == actual)
    		return { "func", "okay" };
    	else
    		return { "func", expected, actual };
    }
    int main()
    {
    	std::string str1, str2("123"), str3{ "234" };
    	std::cout << process(str1, str1).size() << std::endl;
    	for (auto x : process(str2, str2))
    	{
    		std::cout << x << " ";
    	}
    	std::cout << std::endl;
    	for (auto x : process(str2, str3))
    	{
    		std::cout << x << " ";
    	}
    	return 0;
    }
    
    
  4. CPP可以使用一下两种方式创建一个返回数组指针的函数,其中第一个方式叫尾指返回类型声明,可以用这个方法返回函数指针。
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    auto func1(int i) -> int(*)[10]
    {
    	static int arr[10]{ 1,2,3,4,5,6,7,8,9,10 };
    	return &arr;
    }
    auto (*func2(int i))[10]
    {
    	static int arr[10]{ 1,2,3,4,5,6,7,8,9,10 };
    	return &arr;
    }
    auto func3(int i) -> int(*)(int*, int);
    int main()
    {
    	auto arr = func1(1);
    	auto brr = func2(1);
    	for (int i = 1; i < 10; ++i)
    	{
    		std::cout << (*arr)[i] << " ";
    	}
    	std::cout << std::endl;
    	for (int i = 1; i < 10; ++i)
    	{
    		std::cout << (*brr)[i] << " ";
    	}
    	return 0;
    }
    
    
  5. 预处理器定义的一些有用的字符串或者宏定义。
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    #include <cassert>
    void print(size_t size)
    {
    #ifndef NDEBUG
    	std::cout << "Function Name: " << __func__ << std::endl;
    	//打印所在的函数名
    	std::cout << "File name: " << __FILE__ << std::endl;
    	//打印当前行号
    	std::cout << "Line name: " << __LINE__ << std::endl;
    	//打印当前时分秒
    	std::cout << "Time name: " << __TIME__ << std::endl;
    	//打印当前日期
    	std::cout << "Date name: " << __DATE__ << std::endl;
    #endif 
    
    }
    int main()
    {
    	int i = 1;
    	print(1);
    	return 0;
    }
    
    
  6. 函数指针注意一下代码:
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    #include <cassert>
    bool LenthCompare(const std::string& str1, const std::string& str2)
    {
    	return str1.size() < str2.size();
    }
    int main()
    {
    	bool (*pf)(const std::string&, const std::string&);
    	decltype(LenthCompare) *pf2(const std::string& str1, const std::string& str2);
    	pf = LenthCompare;
    	//相当于下面的语句
    	//pf = &LenthCompare;
    	bool b1 = pf("hello", "goodbye");
    	bool b2 = (*pf)("hello", "goodbye");
    	bool b3 = LenthCompare("hello", "goodbye");
    	//上面三条语句的意思是一样的
    	std::cout << b1 << " " << b2 << " " << b3 << std::endl;
    	pf = nullptr;
    	pf = 0;
    	//函数指针可以指向0或者空
    	return 0;
    }
    
    
    1 1 1
    
  7. 函数指针可以传参数和起别名:
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    #include <cassert>
    void UseBigger(const std::string& str1, const std::string& str2,
    	bool pf(const std::string&, const std::string&))
    {
    }
    bool LenghCompare(const std::string& str1, const std::string& str2)
    {
    	return true;
    }
    //上面的函数原型等于下面的函数原型
    /*void UseBigger(const std::string& str1, const std::string& str2,
    	bool (*pf)(const std::string&, const std::string&));*/
    
    typedef bool Func1(const std::string&, const std::string&);
    typedef decltype(LenghCompare) Func2;
    typedef bool (*Func3)(const std::string&, const std::string&);
    typedef decltype(LenghCompare)* Func4;
    using Func5 = bool(*)(const std::string&, const std::string&);
    //上面五种类型起别名的效果一样
    
    
    int main()
    {
    	//可以把函数名直接当函数指针传递参数
    	UseBigger("234", "@34", LenghCompare);
    	return 0;
    }
    
    
  8. 默认构造函数会将类内的值初始化为0或者空,如果类内存在初始值,则将值初始化为该值,如果想定义默认构造函数,可以写出默认函数原型并且在原型后面加=default。通过初始化列表的方式定义构造函数,如果列表没有初始化部分变量,则该变量会像默认构造函数初始化变量一样,被赋值。如果一个类内的变量被mutable修饰,则该变量无论在什么情况下都可以被改变,即使对象被const修饰
    #include <iostream>
    #include <climits>
    #include <vector>
    #include <iterator>
    #include <string>
    #include <initializer_list>
    #include <cassert>
    #include <algorithm>
    class Base
    {
    public:
    	int a = 0;
    	int b = 1;
    	mutable int c = 2;
    	Base() = default;
    	Base(int x, int y) :a(x), b(y) {};
    	void func() const
    	{
    		c = 3;
    	}
    };
    int main()
    {
    	Base b(1, 2);
    	std::cout << b.a << " " << b.b << " " << b.c << std::endl;
    	b.func();
    	std::cout << b.a << " " << b.b << " " << b.c << std::endl;
    }
    
    
    
    1 2 2
    1 2 3
    

文章来源地址https://www.toymoban.com/news/detail-728232.html

到了这里,关于cpp primer笔记030-参数传递的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cpp入门-命名空间,缺省参数

    本小白不久前才刚开始学习c艹,众所周知,c艹是本贾尼祖师爷在使用c的时候遇到了诸多不便,便在对c进行扩展和改进后的得到的新语言,所以说 这一篇博客就带来c艹对c的两个个优化点 当我们在使用C进行日常编程时不会有太多关于变量的烦恼。 但是当我们进行一些中大项

    2023年04月19日
    浏览(43)
  • C++ Primer(读书笔记)

    C++源文件通常以.cc、.cxx、.cpp、.cp、.C作为后缀来命名 C++语言未定义输入输出语句,而是提供了一个全面的标准库来提供IO机制,对应 iostream、fstream、sstream std::cout\\\"Enter Two Numbers\\\"std::endl;。这条语句执行了一个表达式,在C++中,一个表达式产生一个计算结果,它由一个或多个

    2024年02月12日
    浏览(46)
  • C++ Primer Plus笔记: 2023.07.14

    第五章编程题: (1) 第一种解法: 第二种解法: 第三种解法: (2) (3) 第一种解法: 第二种解法: 第三种解法: (4) 第一种解法: 第二种解法: (5) (6) (7)

    2024年02月16日
    浏览(34)
  • 《c++ primer笔记》第十三章 拷贝控制

    1.1拷贝构造函数 ​ 如果一个构造函数的第一个参数是自身类类型的 引用 ,且任何额外参数都由默认值,则此构造函数成为拷贝构造函数。 拷贝构造函数在某些情况下会被隐式地使用,所以不能定义为 expicit 。 合成拷贝构造函数 ​ 合成某某函数 一般出现在我们没定义该函

    2023年04月25日
    浏览(44)
  • C++ Primer Plus笔记: 2023.07.05

    1.在C++中,每个表达式都有值。例如下面的表达式: C++将赋值表达式的值定义为左侧成员的值,因此这个表达式的值为20。 由于赋值表达式有值,因此可以编写下面的语句: 表达式cooks = 4的值为4,因此maids的值为7。 允许上述语句存在的原则也允许编写如下的语句: 下面的程序

    2024年02月12日
    浏览(33)
  • C++ Primer(第5版) 全书重点学习笔记

    目录 第12章 动态内存 12.1 动态内存与智能指针 12.1.6 weak_ptr 12.2 动态数组 12.2.1 new和数组 12.2.2  allocator类   12.1.6 weak_ptr weak_ptr是一种不控制所指向对象生存期的智能指针, 它指向由一个shared_ptr管理的对象。将一个weak ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最

    2024年02月13日
    浏览(50)
  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行,不用区分post和get请求方法,当然java代码要改变一点,在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求: 代码:注意在响应注解的方法里面新添加了形参,其就对应着上面图片中的参数

    2024年02月07日
    浏览(54)
  • Spring MVC参数接收、参数传递

    Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据 编写controller  

    2024年01月16日
    浏览(57)
  • @RequestMapping运用举例(有源码) 前后端如何传递参数?后端如何接收前端传过来的参数,传递单个参数,多个参数,对象,数组/集合(有源码)

    目录 一、@RequestMapping  路由映射 二、参数传递 1、传递单个参数 2、传递多个参数 3、传递对象 4、后端参数重命名 5、传递数组 6、传递集合 7、传递JSON 8、获取url中的参数 9、上传图片/文件 指定请求访问的路径 既可以修饰类,又可以修饰方法 @RequestMapping支持Get、Post、Dele

    2024年02月04日
    浏览(50)
  • @PathVariable、@PathParam、@RequestBody接收axios传递的请求参数;后端接收前端传递过来的参数

    目录 一、前言 :Content-Type 类型    (1)、 application/x-www-form-urlencoded 类型 (2)、application/json 类型 二、@PathVariable 二、@PathParam  三、@RequestBody  四、后端发送数据给前端 五、注意事项         请求参数以key-value的形式传输         请求参数以JOSN串的形式传输         ax

    2024年01月18日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包