回顾:C++开篇课堂
周三,在刚刚结束矩阵分析的考试之后,面向对象程序设计课正式开始了C++的学习,这次课的重点即是面向对象思想的理解。
梳理一下知识点。
C++中函数的默认参数
在函数声明或者在函数定义时,对参数赋初始值,就是函数的默认参数。
例一: 在函数声明时设置参数的值
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
//在函数声明时设置参数的值
double calculate(double r = 1,double pi = 3.14);
int main()
{
cout << calculate() << endl;
}
double calculate(double r,double pi)
{
return r*r*pi;
}
结果:
例二: 在函数定义时设置(错误)
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
double calculate(double r,double pi);
int main()
{
cout << calculate() << endl;
}
double calculate(double r = 1,double pi = 3.14) //在定义函数时设置
{
return r*r*pi;
}
结果:编译错误
不过试了下这样子就可以了:
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
//double calculate(double r,double pi); 注释掉声明
double calculate(double r = 1,double pi = 3.14)
{
return r*r*pi;
}
int main()
{
cout << calculate() << endl;
}
其实本质上还是在函数声明的时候设置默认参数。
**例三: **函数声明和函数定义时同时设置默认参数(错误)
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
double calculate(double r = 2,double pi = 3.14); //声明时设置r为2,pi为3.14
int main()
{
cout << calculate() << endl;
}
double calculate(double r = 1,double pi = 3.14) //定义时设置r为1,pi为3.14
{
return r*r*pi;
}
结果: 编译错误(我使用的是DEV-C++编译器)
由此得到了第一个结论:一般在声明函数是设置默认参数。
那么如果在主函数只传递部分参数呢?
例一
double calculate(double r = 2,double pi = 3.14);
int main()
{
cout << calculate(1) << endl; //只传递一个参数
}
double calculate(double r,double pi)
{
return r*r*pi;
}
结果:3.14
例二
double calculate(double r = 2,double pi = 3.14);
int main()
{
cout << calculate(10,3.14) << endl; //传递两个参数
}
double calculate(double r,double pi)
{
return r*r*pi;
}
结果:314
这两个例子体现了函数中默认函数的作用,当传递进来的参数不足形参的个数时,默认其值为函数声明时设置的默认值。
例三
double calculate(double r,double pi = 3.14); //声明时只对右边的pi进行设置
int main()
{
cout << calculate(10) << endl;
}
double calculate(double r,double pi)
{
return r*r*pi;
}
结果:314
例四(错误)
double calculate(double r = 1,double pi); //声明时只对左边的r进行设置
int main()
{
cout << calculate(3.14) << endl;
}
double calculate(double r,double pi)
{
return r*r*pi;
}
结果:编译错误
由例三和例四可以得出:默认参数定义的方向是从右向左
那么如果我设置多个参数的时候,比如计算一个长方体的体积,开始的时候是这样的:
double calculate(double l,double w,double h);
int main()
{
cout << calculate(1,2,3) << endl;
}
double calculate(double l,double w,double h)
{
return l*w*h;
}
结果是6,那么接下来我对l和h设置默认值:
double calculate(double l = 1,double w,double h = 3);
int main()
{
cout << calculate(2) << endl;
}
double calculate(double l,double w,double h)
{
return l*w*h;
}
编译不通过,但是如果把上面的语句改成:
double calculate(double l,double w = 2,double h = 3);
int main()
{
cout << calculate(2) << endl;
}
double calculate(double l,double w,double h)
{
return l*w*h;
}
结果就是正确的12了。
回顾:C++开篇课堂的更多相关文章
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- Android事件分发机制(上)
Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- LeetCode之LRU Cache 最近最少使用算法 缓存设计
设计并实现最近最久未使用(Least Recently Used)缓存. 题目描述: Design and implement a data structure for Least Recently ...
- VBA中方法的函数式调用和过程式调用的差别
因见到有人求助批量设置工作簿中的超链接,尝试写了一段代码: Sub AddHyperlinks() Dim strName As String, source As String, target As ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- 从源码的角度解析View的事件分发
有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图 ...
- 【转】Android onTouch()和onTouchEvent()区别
1.onTouch()方法: onTouch方式是View的OnTouchListener接口中定义的方法. 当一个View绑定了OnTouchListener后,当有Touch事件触发时,就会调用o ...
- Android View的事件分发机制
准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...
随机推荐
- Python json pickle 模块 区别
json 支持 str.list.dict.int.tuple 数据类型 pickle 支持Python所有里的所有数据类型 缺点: 只能在Python使用 总结: 1.JSON只能处理基本数据类型. ...
- FineReport实现java报表权限使用的效果图
Java报表-多级权限配置说明 Java报表-联合填报 Java报表-模板内容权限控制 Java报表-权限细粒度控制
- Git:pull --rebase 和 merge --no-ff
首先是吐嘈 如果你正在 code review,看到上图(下文将称之为:提交线图)之后,特别是像我这样有某种洁癖的人,是否感觉特别难受?如果是的话,请看下文吧 :) 为什么 Git 作为分布式版本控制 ...
- Selenium之Css Selector使用方法
什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议使用火狐浏览器,下载插件,FireFinder.Fire ...
- PAT 1018 Public Bike Management[难]
链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018 Public ...
- Jquery each&forEach
jQuery方法 语法 .each() 作用 用来遍历dom 用法 $(dom).each( function(index, Element) ) { do Something... } 参数 第一个 ...
- redis error It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING
应用redis出现如下错误 It was not possible to connect to the redis server(s); to create a disconnected multip ...
- 集合框架—HashMap
HashMap提供了三个构造函数: HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap. HashMap(int ini ...
- 复制控件出错--提示XX控件不存在
有时候比较喜欢复制粘贴,但是结果就是,经常出现XX控件找不到,或者不存在之类的话~~ 错误如下: 在相当郁闷的时候,尝试了一种很土土的方法,就是直接新建一个同名新页面,把前台和后台的代码复制进去~~ ...
- 数据仓库基础(十三)Informatica workflow
本文转载自:http://www.cnblogs.com/evencao/p/3154715.html 看了几天的Informatica ,关于infor的资料也比较少,主要的<商业智能深入浅出 ...