周三,在刚刚结束矩阵分析的考试之后,面向对象程序设计课正式开始了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++开篇课堂的更多相关文章

  1. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  2. Android事件分发机制(上)

    Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...

  3. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  4. LeetCode之LRU Cache 最近最少使用算法 缓存设计

    设计并实现最近最久未使用(Least Recently Used)缓存. 题目描述: Design and implement a data structure for Least Recently ...

  5. VBA中方法的函数式调用和过程式调用的差别

    因见到有人求助批量设置工作簿中的超链接,尝试写了一段代码: Sub AddHyperlinks() Dim strName As String, source As String, target As ...

  6. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  7. 从源码的角度解析View的事件分发

    有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图 ...

  8. 【转】Android onTouch()和onTouchEvent()区别

    1.onTouch()方法: onTouch方式是View的OnTouchListener接口中定义的方法. 当一个View绑定了OnTouchListener后,当有Touch事件触发时,就会调用o ...

  9. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

随机推荐

  1. 关于微信小程序,你想知道的他们都问了

    微信公开课深圳站小程序专场刚刚结束,大家通过"微信公开课+"互动小程序提出了许多问题.我们筛选了后台问得最多的九个问题进行解答,快来看看这里有没有你想要的答案吧! @谢杨:小程序是 ...

  2. rplidar跑cartographer

    一.Cartographer编译 cartographer依赖的大型第三方库很少,编译时基本没有依赖项问题,基本按照官方文档的步骤来,略作修改.使用的环境是Ubuntu16.04+ROS Kineti ...

  3. word使用

    1:插入图片,显示不完整,需要>点击上方的段落,选择单倍行距 2:wps  可以直接右键选择保存文件中的图片 3:word中换行符的标识符为^p ,可以用来替换换行符. 4:使word中某一段背 ...

  4. “在引用COM组件时,出现了无法嵌入互操作类型。。。”的错误

    这两天在做一个需要将wps文档转换成word文档的程序,在调用wps的com组件时项目编译是没有问题的,但当运行的时候却弹出了下面的错误提示: 从网上百度一番后,找到了正确的解决方法. 先从Com组件 ...

  5. redis的5种数据结构的使用场景介绍

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  6. mysql的count方法详解

    1.cout(*)会统计为null的行: 2.count(列名)不会统计此列null值的行: 3.count(distinct col)计算该列除null之外的不重复数量:

  7. 网络编程—代码—UDP数据报传输

    UDP:数据报传输 1.接收端 public class Udps { //接收端 public static void main(String[] args) throws IOException ...

  8. IntelliJ IDEA 编译Java程序出现 'Error:java: 无效的源发行版: 9' 解决方法

    最新安装的IntelliJ IDEA 2018.1编译器,创建Java Project,并选择之前安装好的Eclipse配置的JDK,如图所示: 在工程中添加 Main.class, main函数中写 ...

  9. Windows批处理程序bat

    @echo off    关闭回显,否则脚本中的命令都会输出,关闭后只显示结果. setlocal ENABLEDELAYEDEXPANSION 在for循环中变量扩展时需要用到 copy /Y ms ...

  10. shell 命令总结

    删除0字节文件 find . -type f -size 0 -exec rm -rf {} \; find . type f -size 0 -delete 查看进程,按内存从大到小排列 ps -e ...