C++ Primer 学习笔记 第六章 函数

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, &divide };
	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, &divide };

	int a=4, b = 2;
	// 使用范围for遍历并调用函数
	for (auto fuc : ivec) {
		cout << fuc(a, b) << endl;
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值