C++ 07 函数

定义

函数者,黑盒是也。

参数传递

形参初始化:若形参为非引用类型,复制实参值,若未引用类型,为实参的别名。

指针形参与const形参

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

void swap(int * a, int * b); // 指针作为形参
void print(const int * a, const int * b); // const使参数不能被改变

int main()
{
	int a = 1, b = 2;
	print(&a, &b);
	swap(&a, &b);
	print(&a, &b);
}

void swap(int * a, int * b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void print(const int * a, const int * b)
{
	cout << "a :" << *a << ", b : " << *b << endl;
}

容器遍历查找

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

vector<int>::const_iterator find_val(
	vector<int>::const_iterator beg,
	vector<int>::const_iterator end,
	int value,
	vector<int>::size_type &occurs);

int main()
{
	vector<int> vi(10);
	vi[3] = 3;

	for (vector<int>::iterator iter = vi.begin(); iter != vi.end(); ++iter)
		cout << *iter << ",";
	cout << endl;
	vector<int>::size_type occurs;
	vector<int>::const_iterator citer = find_val(vi.begin(), vi.end(), 3, occurs);
	cout << "find them : " << *citer << " , occurs time : " << occurs << endl;
}

// 从迭代器范围内找到一个值,返回第一个位置,找不到则返回末尾。使用参数occurs表明
vector<int>::const_iterator find_val(vector<int>::const_iterator beg, vector<int>::const_iterator end, int value, vector<int>::size_type & occurs)
{
	vector<int>::const_iterator res_iter = end;
	occurs = 0;
	for (; beg != end; ++beg)
	{
		if (*beg == value)
		{
			if (res_iter == end) // 若找到值,将返回的迭代器指向第一个位置
				res_iter = beg;
			++occurs;
		}
	}
	return res_iter;
}

引用返回左值

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

// 返回引用
char &get_val(string &str, string::size_type ix)
{
	return str[ix];
}

int main()
{
	string s("hello");
	cout << s << endl;
	get_val(s, 1) = 'E'; // 对引用赋值

	cout << s << endl;
	return 0;
}

参数默认值

#include <iostream>
#include <string>
#include <sstream>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::ostringstream;

string screenInit(string::size_type hight = 20,
	string::size_type width = 30); // 参数默认值

int main()
{
	cout << "scree is " << screenInit(50);

	return 0;
}

string screenInit(string::size_type hight, string::size_type width)
{
	ostringstream strm;
	strm << "hight:" << hight << " and width: " << width << endl; // 类型转换
	return strm.str();
}

内联函数避免函数调用开销,放入头文件

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

// 内联函数避免函数调用开销,放入头文件
inline const string & shorterString(const string &s1, const string &s2)
{
	return s1.size() < s2.size() ? s1 : s2;
}

int main()
{
	cout << shorterString("aa", "bbb") << endl;
	return 0;
}


类的成员函数

Dog.h

#pragma once
#include <iostream>
#include <string>

using std::string;

class Dog {
public: // 构造方法
	Dog(const string name)
	{
		Dog::name = name;
	}
	Dog(): name("ss"),age(1) {} //构造函数初始化列表
public: // 公共成员函数
	string get_name() const; // 返回值类型为const
	int get_age() {		return this->age;	}
	void set_age(int age) { this->age = age; }
	void to_string() const;
private: // 私有成员变量
	string name;
	int age;
};

inline  // 共有成员函数的内联实现
string Dog::get_name() const
{
	return Dog::name;
}

main.c

#include <iostream>
#include "Dog.h"

using std::cin;
using std::cout;
using std::endl;
void Dog::to_string() const
{
	cout << "dog name : " << this->get_name() << ",age :" << this->age << endl;
}
int main()
{
	Dog dog; // 默认构造方法初始化
	dog.to_string();
	Dog tom("tom");
	tom.set_age(18);
	tom.to_string();
	return 0;
}

指向函数的指针

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::endl;

int lengthCompare(const string &, const string &);

int(*ff(int))(int*, int); // 返回指向函数的指针 的函数调用

int f(int *, int); 

int main()
{
	// 使用typedef 简化函数指针使用
	typedef int(*compFcn)(const string &, const string &);
	compFcn pf = lengthCompare;
	int flag = lengthCompare("hi", "hello");
	cout << "compare result : " << flag << endl;
	flag = pf("hello", "hello");
	cout << "compare result : " << flag << endl;
	flag = (*pf)("hello", "hi");
	cout << "compare result : " << flag << endl;
	int i = 1;
	int(*fp)(int*, int) = ff(i); // 返回指向函数的指针 的函数调用
	int r = fp(&i, i); // 函数指针调用
	cout << "最终结果:" << r << endl;
	cout << "最终结果,一步到位:" << ff(i)(&i,i) << endl;
	return 0;
}

int lengthCompare(const string &s1, const string &s2)
{
	return s1.size() - s2.size();
}

int(*ff(int a))(int * p, int i)
{
	cout << "用参数a做点什么:" << a << endl;
	int(*fp)(int*, int) = f; // 返回函数指针
	return fp;
}

int f(int * p, int i)
{
	return (*p) + i;
}

posted @ 2017-06-03 20:17  张狂莫怪  Views(181)  Comments(0Edit  收藏  举报