182 定义与调用函数
#include <iostream>
#include<string>
#include<vector>
using namespace std;
// 函数定义
int fact(int val) {
int ret = 1;
while (val > 1)
ret *= val --;
return ret;
}
int main() {
// 函数调用
int j = fact(5);
cout << "5! is " << j << endl;
return 0;
}
183 定义函数的常见错误
// 错误,必须一个一个的申明类型
int f3(int v1,v2)
// 正确做法
int f4(int v1, int v2)
184 练习6.5
#include <iostream>
#include<string>
#include<vector>
using namespace std;
// 函数定义
double abs_cal(double num) {
if (num < 0){
return -num;
}
return num;
}
int main() {
// 函数调用
cout << abs_cal(-8) << endl;
return 0;
}
185 练习6.6
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int cal(int num) {
static int total = 0;
total += num;
return total;
}
int main() {
int result = 0;
for (int i = 0; i <= 100; ++i) {
result = cal(i);
}
cout << result << endl;
return 0;
}
185 练习6.7
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int count_cal() {
static int total = 0;
return ++total;
}
int main() {
int result = 0;
for (int i = 1; i <= 100; ++i) {
cout << count_cal() << endl;
}
return 0;
}
187 练习6.1.3
函数定义文件fact.cpp
#include <iostream>
#include<string>
#include<vector>
using namespace std;
// 定义函数
int count_cal() {
static int total = 0;
return ++total;
}
头文件chapter.h
#pragma once
// 在头文件申明函数
int count_cal();
主函数main.cpp
#include <iostream>
#include "chapter.h"
using namespace std;
int main() {
// 调用函数
for (int i=1; i<=100; ++i)
cout << count_cal() << endl;
return 0;
}
188 参数传递
#include <iostream>
#include "chapter.h"
using namespace std;
void reset(int* ip) {
*ip = 0;
ip = 0;
}
int main() {
int i = 42;
// i的值被修改了, 但是p的指向并没有变化,还是指向i
int* p = &i;
reset(p);
cout << i << " " << *p << endl;
// 0 0
return 0;
}
188 练习6.10
#include <iostream>
#include "chapter.h"
using namespace std;
void swap(int* pi1, int* pi2) {
int temp = *pi1;
*pi1 = *pi2;
*pi2 = temp;
}
int main() {
int a = 4;
int b = 2;
swap(&a, &b);
cout << a << " " << b << endl;
// 0 0
return 0;
}
188 传递引用参数
#include <iostream>
#include "chapter.h"
using namespace std;
// 传递引用参数
void reset(int& i) {
i = 0;
}
int main() {
int j = 42;
reset(j);
cout << j << endl;
// 0
return 0;
}
189 不拷贝情况下比较字符串大小
#include <iostream>
#include "chapter.h"
using namespace std;
bool isShorter(const string& s1, const string& s2)
{
return s1.size() < s2.size();
}
int main() {
string s1 = "hell";
string s2 = "world";
cout << isShorter(s1, s2) << endl;
return 0;
}
190 统计字符出现的次数
#include <iostream>
#include "chapter.h"
using namespace std;
string::size_type find_char(const string& s, char c, string::size_type& occurs)
{
auto ret = s.size();
occurs = 0;
for (decltype(ret) i = 0; i != s.size(); ++i) {
if (s[i] == c) {
if (ret == s.size())
ret = i;
++occurs;
}
}
return ret;
}
int main() {
string s = "heollo";
string::size_type ctr;
auto index = find_char(s, 'o', ctr);
cout << index << " " << ctr << endl;
return 0;
}
190 练习6.12
#include <iostream>
#include "chapter.h"
using namespace std;
void swap(int &i1, int &i2) {
int temp = i1;
i1 = i2;
i2 = temp;
}
int main() {
int a = 4;
int b = 2;
swap(a, b);
cout << a << " " << b << endl;
// 0 0
return 0;
}
192 练习6.17
#include <iostream>
#include "chapter.h"
using namespace std;
// 直接在s上面判断
bool cal(const string &s) {
for (auto i : s)
{
if (isupper(i))
return true;
}
return false;
}
// 实参拷贝一份然后进行操作
string change(string s) {
for (int i = 0; i < s.size(); i++)
{
s[i] = toupper(s[i]);
}
return s;
}
int main() {
string s = "Hello";
cout << cal(s) << endl;
cout << change(s) << endl;
return 0;
}
194 数组传入函数的方法
方法一:
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
void print(const int* beg, const int* end) {
while (beg != end) {
cout << *beg++ << endl;
}
}
int main() {
int j[2] = { 0, 1 };
print(begin(j), end(j));
return 0;
}
方法二:
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
void print(const int ia[], size_t size) {
for (size_t i = 0; i != size; ++i) {
cout << ia[i] << endl;
}
}
int main() {
int j[2] = { 0, 1 };
print(j, end(j) - begin(j));
return 0;
}
195 数组引用形参
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
void print(int(&arr)[3]) {
for (auto elem : arr) {
cout << elem << endl;
}
}
int main() {
int j[3] = { 0, 1, 2 };
print(j);
return 0;
}
196 练习6.21
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
int compare(int a, const int* p) {
if (a > *p) {
return a;
}
else {
return *p;
}
}
int main() {
int a = 8;
const int *pi = &a;
cout << compare(4, pi) << endl;
return 0;
}
196 练习6.22
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
// int *&a 解释 &与a靠的比较近,所以是一个引用,前面是*, 所以是指针变量的引用
void change(int *&a, int *&b) {
int *temp = a;
a = b;
b = temp;
cout << *a << " " << *b << endl;
}
int main() {
int c = 2;
int d = 4;
int* a = &c;
int* b = &d;
change(a, b);
cout << *a << " " << *b << endl;
return 0;
}
196 练习6.23
#include <iostream>
#include "chapter.h"
#include <vector>
using namespace std;
void print(int i, int *j, size_t size) {
cout << i << endl;
for (size_t i = 0; i != size; ++i) {
cout << j[i] << endl;
}
}
int main() {
int i = 0, j[2] = { 0, 1 };
print(i, j, end(j) - begin(j));
return 0;
}
198 命令行给main函数去传递参数
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char const** argv)
{
for (int i = 0; i < argc; i++) {
cout << argv[i] << endl;
}
system("pause");
return 0;
}
198 含有可变参数的函数
#include<iostream>
#include<string>
using namespace std;
void error_msg(initializer_list<string> il) {
for (auto beg = il.begin(); beg != il.end(); ++beg) {
cout << *beg << " ";
}
cout << endl;
}
int main()
{
error_msg({ "hello", "world" });
error_msg({ "i", "love", "you" });
system("pause");
return 0;
}
199 练习6.27
#include<iostream>
#include<string>
using namespace std;
int cal_sum(initializer_list<int> num) {
int result = 0;
for (auto beg = num.begin(); beg != num.end(); ++beg) {
cout << *beg << endl;
result += *beg;
}
return result;
}
int main()
{
cout << cal_sum({ 1, 2, 3, 4, 5 }) << endl;;
system("pause");
return 0;
}
202 引用返回左值
#include<iostream>
#include<string>
using namespace std;
char& get_val(string& str, string::size_type ix) {
return str[ix];
}
int main()
{
string s = "a value";
cout << s << endl;
get_val(s, 0) ='A';
cout << s << endl;
system("pause");
return 0;
}
204 递归程序
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int factorial(int val) {
if (val > 1) {
return factorial(val - 1) + val;
}
return 1;
}
int main()
{
cout << factorial(100) << endl;
return 0;
}
205 递归输入vector的内容
#include<iostream>
#include<string>
#include<cstdlib>
#include<vector>
using namespace std;
int factorial(vector<int>::iterator vec_begin, vector<int>::iterator vec_end) {
if (vec_begin != vec_end) {
cout << *vec_begin << endl;
factorial(++vec_begin, vec_end);
}
else {
return 0;
}
}
int main()
{
vector<int> ivec = { 1, 2, 3, 4, 5 };
factorial(ivec.begin(), ivec.end());
return 0;
}
205 声明一个返回数组指针的函数
#include<iostream>
#include<string>
#include<cstdlib>
#include<vector>
using namespace std;
int(*func())[3]{
int a[3] = {1, 2, 3};
int(*b)[3] = &a;
// 返回了局部对象的引用,执行上面是没有问题的,但是会产生未知的结果
return b;
}
// 和上面的定义方式是等价的
auto func() -> int(*)[3]{
int a[3] = {1, 2, 3};
int(*b)[3] = &a;
// 返回了局部对象的引用,执行上面是没有问题的,但是会产生未知的结果
return b;
}
int main()
{
int(*c)[3] = func();
for (auto i : *c) {
cout << i << endl;
}
return 0;
}
205 声明一个返回数组指针的函数 用decltype
#include<iostream>
#include<string>
#include<cstdlib>
#include<vector>
using namespace std;
int odd[] = { 1, 3, 5, 7, 9 };
int even[] = { 0, 2, 4, 6, 8 };
decltype(odd) *arrPtr(int i) {
return (i % 2) ? &odd : &even;
}
int main()
{
int (*pi)[5] = arrPtr(1);
for (auto i : *pi) {
cout << i << endl;
}
return 0;
}
209 const_cast和重载
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
const string& shorterString(const string& s1, const string& s2) {
return s1.size() <= s2.size() ? s1 : s2;
}
string& shorterString(string& s1, string& s2) {
auto& r = shorterString(const_cast<const string&>(s1), const_cast<const string&>(s2));
return const_cast<string&>(r);
}
int main() {
string s1 = "hello";
string s2 = "worl";
const string res = shorterString(s1, s2);
cout <<res<< endl;
return 0;
}
函数的默认参数
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
string screen(int ht = 24, int wid = 80, char background = ' ') {
return "dfd";
}
int main() {
string window;
window = screen();
window = screen(24, 80, ' ');
// 以下错误, 要改变第三个参数的值,前面两个参数也必须传参
// window = screen(,,'?')
return 0;
}
214 内联函数,不需要函数运行花销
加入inline关键字即可
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
inline const string& shorterString(const string& s1, const string& s2) {
return s1.size() <= s2.size() ? s1 : s2;
}
int main() {
string s1 = "hello";
string s2 = "nice";
cout << shorterString(s1, s2) << endl;
return 0;
}
214 constexpr函数
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
constexpr int new_sz() {
return 2;
}
constexpr size_t scale(size_t cnt) {
return new_sz() * cnt;
}
int main() {
constexpr int a = scale(4);
cout << a << endl;
// 正确,因为是常量表达式
int arr[scale(4)];
int i = 3;
// 错误,计算的结果不是常量表达式
// int arr2[scale(i)];
return 0;
}
126 预处理变量
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
void print(const int ia[], size_t size) {
// 打印函数名
cerr << __func__ << ": array size is" << size << endl;
// 文件路径
cout << __FILE__ << endl;
// 行号 15
cout << __LINE__ << endl;
// 时间
cout << __TIME__ << endl;
// 日期
cout << __DATE__ << endl;
}
int main() {
int arr[] = { 1, 2, 3 };
size_t b = 3;
print(arr, b);
return 0;
}
217 函数匹配
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
void f() {
cout << "empty" << endl;
}
void f(int) {
cout << "int" << endl;
}
void f(int, int) {
cout << "int int " << endl;
}
void f(double, double = 3.14) {
cout << "double double" << endl;
}
int main() {
// 调用double,double
f(5.6);
//二义性报错, 有相似的结果无法找到最优
// f(42, 2.56);
return 0;
}
220 函数匹配以及const实参
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
int lookup(int&) {
cout << "int &" << endl;
return 0;
}
int lookup(const int&) {
cout << "const int&" << endl;
return 0;
}
int main() {
int a;
const int& b = a;
lookup(b);
return 0;
}
222 重载函数的指针
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
// 重载函数的指针
void ff(int*) {
cout << "int *" << endl;
}
void ff(unsigned int) {
cout << "unsigined int" << endl;
}
int main() {
void (*pf)(unsigned int) = ff;
pf(23);
// 必须精确匹配,本来中找不到匹配函数
// void (*pf2)(double) = ff;
return 0;
}
返回指向函数的指针
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
int f1(int, int) {
return 0;
}
int main() {
// 定义vector,元素为指向该函数的指针
vector<int(* )(int, int)> ivec = { f1 };
return 0;
}
224 练习6.55
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
int add(int a, int b) {
return a+b;
}
int sub(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
return a / b;
}
int main() {
// 定义vector,元素为指向该函数的指针
// vector<int(* )(int, int)> ivec = { add, sub, multiply, divide };
vector<int(*)(int, int)> ivec = { &add, &sub, &multiply, ÷ };
return 0;
}
练习 6.56
#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;
int add(int a, int b) {
return a+b;
}
int sub(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
return a / b;
}
int main() {
// 定义vector,元素为指向该函数的指针
// vector<int(* )(int, int)> ivec = { add, sub, multiply, divide };
vector<int(*)(int, int)> ivec = { &add, &sub, &multiply, ÷ };
int a=4, b = 2;
// 使用范围for遍历并调用函数
for (auto fuc : ivec) {
cout << fuc(a, b) << endl;
}
return 0;
}