《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数

1.返回指向数组/函数的指针

           顾名思义,就是函数返回值为指向数组/函数的指针

           数组的性质:不能被拷贝,函数也不能返回数组。但可以返回数组指针/引用,声明一个返回数组指针的函数,有四种方式,一种是直接声明,格式为:

                          int  (*func(int i) [10];   //函数声明

          第二种是使用using/typedef类型别名来简化:

                             typedef  int  arr[10];  /using arr=int[10];      //定义类型别名和数组等效

                                                      arr *func(int i);  //函数声明

          第三种是采用C++11提供的尾后返回类型的方式来声明数组指针,具体格式如下:

                                     auto func(int i)  -> int(*)[10];

          第四种是知道数组指针指向那种类型的数组情况下,可以采用decltype获得数组类型(decltype,sizeof,typeid不会让数组退化为指针),具体格式如下:

                                               int array[10] = { 0 };

                                               decltype(array) *func(int i);

         函数指针是采用需要声明的指针名替换函数名来完成函数指针的声明,函数指针由函数的返回值参数列表类型共同决定。其声明、赋值和调用如下所示:

                bool LengthCompare(const string & , const string &);   //函数声明

                bool(*pf)(const string & , const string &);               //函数指针声明

                      pf=LengthCompare;                                            //函数指针赋值

                      pf=&LengthCompare;                                          //函数指针赋值

                bool b1 = pf("hello”,“good”);                             //直接调用,等价于bool b3=LengthCompare("hello”,“good”);

                bool b2 = (*pf)("hello”,“good”);                       //解引用调用

        函数指针作为C语言的半壁江山,其可以作为函数的形参,来实现一类函数的功能,从来增加代码的鲁棒性。具体代码如下:

void usebigger(const string &s1,const string&s2, bool pf(const string &,const string &));//函数指针做形参,pf替换为(*pf)一样

        使用using/typedef可以简化上述的过程,具体代码如下:

 typedef bool func(const string &,const string&)/typedef decltype(LengthCompare) funcz;//声明func/funcz为函数类型;

typedef bool (*funcp)(const string &,const string&)/typedef decltype(LengthCompare)  *funcp2;//声明funcp/funcp2函数指针类型 

void usebigger(const string&,const string&,func/funcp2);//函数形参为函数指针,函数名做形参时可做函数指针用

        另外函数指针也可以作为返回值使用,具体形式为:

               int (* f1(int) )(int * ,  int); //声明一个函数指针,数指针指向的是一个参数列表为int*和int,返回值为int的函数。

       使用尾置返回类型的方式声明一个返回函数指针的函数,格式为:

              auto f1(int)  -> int (*)(int * , int);

2.函数重载

          函数重载的条件:相同作用域,同名函数,不同参数列表。其中返回类型和参数列表中的顶层const不能作为函数重载的依据。如果同名函数不在同一作用域内,但在同一个文件中,则属于函数覆盖

          重载函数调用时,如有多个函数满足,则优先考虑不用隐式转换的版本。

          const_cast可以用于改变运算对象的底层const属性,可以用于增加const属性或者去除const属性,这里很容易理解错说const_cast只能用于去除原因对象的const属性,《C++ Primer 第五版》p209的例子可以看出const_cast的另外一种用法。

         在查找const_cast相关博客介绍过程中,无意之间发现了一个程序中的专业名词“常量折叠”,具体意思在编译期间简化常量表达式的一个过程,简单来说就是将常量表达式计算求值,并对求得的值来替换表达式,放入常量表中,具体详细的情况可参考博客:https://blog.csdn.net/it_wjw/article/details/86668302

3.默认形参、inline函数和constexpr函数

         函数的默认形参就是在调用时函数可以不给实参,此时函数的形参采用默认参数值,多用于某些函数参数值固定的情况。默认形参之后就不能再出现需要初始化的形参

         内联函数(inline函数)用于优化规模较小、流程直接、使用频繁的函数,使用内联函数能够省去函数的出入栈过程和参数的拷贝过程,但是inline只是对编译器的一个请求,编译器可以忽略这个请求。inline函数的实质是在调用函数的地方直接把函数替换调用函数。

        constexpr函数:通常用于常量表达式的函数(通常会被隐式inline化)。要求:返回类型和形参类型(应该是实参的带入值)都是字面值常量;函数体有且仅有一条return语句;函数体中的语句在运行时不执行任何操作。

         由于inline和constexpr函数都属于函数调用时直接将函数体和调用函数替换的情形,因此inline和constexpr函数应该讲定义放在头文件中,另外这两种函数可以在多个文件中重复定义,但必须保证多个定义完全相同**新知识点

4.调试代码工具

          assert(断言,头文件在cassert中);用于辅助验证不可能发生的事情。assert括号中的条件为真,则对程序无影响,否则程序停止运行。

          NDENUG 预处理变量,如果定义了这个预处理变量,不执行assert,没有定义这个预处理变量,则执行assert(默认)。

          预处理器提供5个预处理器定义的程序调试名字:

                       _ _ func _ _:输出当前调试函数的名字

                       _ _ FILE _ _:输出当前文件名的字符串字面值

                       _ _ LINE _ _:输出当前行号的整型字面值

                      _ _ TIME _ _:输出当前文件编译时间的字符串字面值

                      _ _ DATE _ _:输出当前文件编译日期的字符串字面值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

136. 只出现一次的数字 golang

Me 1. 先排序就好做了 执行用时 :16 ms, 在所有 Go 提交中击败了27.90%的用户 内存消耗 :4.7 MB, 在所有 Go 提交中击败了100.00%的用户func singleNumber(nums []int) int {sort.Ints(nums)for i:0; i < len(nums); i {if i len(nums) - 1 {return nums[i]}if nums[i] …

《C++ Primer 第五版》(第1~6章总结)

1.C采用标准库文件iostream定义的两个对象来实现IO机制。 2.代码注释应解释关键数据的变量含义和代码完成了什么功能&#xff0c;力求简洁易懂。 3.正确理解初始化和赋值&#xff0c;声明和定义的含义&#xff1f;初始化是在定义对象的时候同时赋值&#xff0c;赋值是定义对象…

268. 缺失数字 golang

Me 首项加末项乘以项数/2.就是总和。然后剪掉nums里面的数组和 func missingNumber(nums []int) int {var sum intlens : len(nums)for _, value : range nums {sum value}return ((1 lens) * lens) / 2 - sum }

使用touch更新文件的时间

#&#xff01;/bin/bashfunction read_dir() {for file in ls $1doif[-d $1"/"$file]thenread_dir $1"/"$fileelseecho $1"/"$filetouch $1"/"$filefidone }read_dir ./

231. 2的幂 golang

Me func isPowerOfTwo(n int) bool {return n > 0 && (n & (n-1)) 0 }

linux/windows上STM32固件烧写工具的开发demo

1.主要实现功能&#xff1a;完成对HEX和DFU文件的烧写&#xff0c;显示烧写的进度等功能 2.开发工具:Qt creator4.9.0 3.开发系统平台&#xff1a;windows系统和linux系统两套平台 4.具体开发步骤&#xff1a; 1&#xff09;设计整体的界面&#xff0c;包括文件选择界面(dfu和h…

338. 比特位计数 golang

Me func countBits(num int) []int {result : make([]int, num1)for i:0; i<num; i {result[i] numberOne(i)}return result }func numberOne(x int) int {if x 0 {return 0}var count intfor x ! 0 {x x & (x - 1)count}return count }

Qt使用qss文件管理stylesheet

内容总结简介&#xff1a; 1&#xff09;使用.qss后缀的文件来管理Qt中每个类的具体组件的stylesheet设置。 2&#xff09;在类中使用具体.qss文件中的设置。 3&#xff09;解决控件中多个相同组件不同设置或者同一个控制不同子控制或者伪状态的问题。 1.新建后缀名为.qss的文…

283. 移动零golang

Me 遍历所有数组&#xff0c;统计0的个数倒着把零写入数组末尾 func moveZeroes(nums []int) {var count, j intfor _, key : range nums {if key 0 {count} else{nums[j] keyj}}for i:len(nums) - count; i < len(nums); i {nums[i] 0} }最优解(快慢指针) 减少了数组…

QT自定义MainWindow

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;自定义边框&#xff0c;标题栏&#xff0c;工具栏&#xff0c;内容栏&#xff0c;状态栏&#xff08;后面三个代码中没有实现实现&#xff09; 2&#xff09;重写鼠标事件…

485. 最大连续1的个数 golang

Me func findMaxConsecutiveOnes(nums []int) int {max : 0for i,j : 0, -1; i < len(nums); i {if nums[i] 0 {j i} else {if max < i -j {max i - j}}}return max }

QTextEdit实现图片和文本同行显示

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;实现图片和文本在同一行显示&#xff0c;且能够设置字体大小和颜色 2&#xff09;能够手动设置行的宽度和间距 3&#xff09;设置字体样式&#xff0c;然后添加图片&#…

3. 无重复字符的最长子串 golang

官解 func lengthOfLongestSubstring(s string) int {n : len(s)ans : 0subMap : make(map[byte]int)for i, j : 0, 0; j < n; j {if v, ok : subMap[byte(s[j])]; ok {if i < v {i v}}if ans < (j - i 1) {ans j - i 1}subMap[byte(s[j])] j 1}return ans }

QQuickWidget + QML编程实现酷炫动态动画效果

1.具体需求&#xff1a;当Qt开发项目中需要实现简单的动态酷炫动画效果时&#xff0c;我们可以使用Qt中的QQuickWidget来实现&#xff0c;同时还可以使用QML编程来实现具体的动画效果&#xff0c;具体实现的效果如下所示&#xff1a; 2.具体操作和实现效果图&#xff1a; 1&am…

Qt中的四种信号与槽的连接方式

1. UI界面右键点击控件&#xff0c;选择“转到槽“&#xff0c;系统会在cpp中自动添加这个组件对应的槽函数 2.在Ui界面的下面 siga如l & slot editor栏中手动添加 3.在代码中使用connect显示添加 4. 使用on_对象名_事件名隐式连接&#xff0c;以QPushButton为例 QPushBut…

20. 有效的括号 golang 堆栈

借用arraystack的包完成 import "github.com/emirpasic/gods/stacks/arraystack"func isValid(s string) bool {stack : arraystack.New()for _, c : range s {if c ( {stack.Push())} else if c [ {stack.Push(])} else if c { {stack.Push(})} else {if stack.…

215. 数组中的第K个最大元素 golang

Me func findKthLargest(nums []int, k int) int {sort.Ints(nums)return nums[len(nums)-k] }golang实现快排和冒泡排序 1. bubbleSort // method2 func swap(a *int, b *int) {temp : *a*a *b*b temp }func bubbleSort(nums []int) {for i:0; i < len(nums); i {for…

Qt实现对json文件的解析

json是一种轻量级的数据结构&#xff0c;其内部的结构是一种键值对(key-value)的组合&#xff0c;最外层是{ }。key是带双引号的字符串常亮&#xff0c;用于获取和存储&#xff1b;value的值可以是bool变量&#xff0c;字符串常量&#xff0c;对象或数组(也是一个key-value的组…

解决QTreeWidget中item无法整行同时显示相同颜色

对于QTreeWidget来说&#xff0c;继承自QTreeView&#xff0c;因此设计QTreeWidget中的样式设计&#xff0c;归根结底是对QTreeView的样式设计&#xff0c;而对于QTreeView中item样式设计&#xff0c;可以分为对branch和item设计&#xff0c;另外QT Style Sheet可以通过设置sho…

279. 完全平方数 golang

Me func checkRecord(s string) bool {return !(strings.Count(s, "A") > 1 || strings.Contains(s, "LLL")) }golang的string用法 func EqualFold func EqualFold(s, t string) bool 判断两个utf-8编码字符串&#xff08;将unicode大写、小写、标题…