【C++进阶心法 函数】

1、main()函数不一定是程序中第一个执行的函数

#include <iostream>
using namespace std;
class A{
public:
	A()
	{
		cout<<"In default A's constructor"<<endl;
	}
}; 

A a;
int main()
{
	cout<<"In main()"<<endl;

	return 0;
}

实际上,所有类外对象的构造函数都是先于main()函数执行的。如果要对类中的对象进行初始化,那么这些对象的构造函数也是在main()函数之前执行的。

2、函数参数入栈方式与调用约定

(1) 调用约定简介

       C/C++中常见的调用规范有__cdecl、__stdcall、__fastcall和__thiscall。

3、函数调用时栈的变化情况

4、如何禁止函数传值调用

按照参数形式的不同,C++应有3种函数调用方式:传值调用、引用调用和指针调用

传值调用在进入函数体前,会在栈上建立一个实参的副本,而引用和指针调用没有这个动作。

建立副本的操作是利用拷贝构造函数进行的。因此要禁止传值调用,就要在类的拷贝构造函数上做文章

(1) 不显式定义拷贝构造函数不可行,编译器会生成默认拷贝构造函数

(2) 显式定义拷贝构造函数,并将访问权限设置为private 

(3) 关于拷贝构造函数的说明

         A、拷贝构造函数A(const A& ){ }, 拷贝构造函数的参数必须是一个引用或一个指针,传值的方式会调用该类的拷贝构造函数,造成无穷递归拷贝构造函数

        B、拷贝构造函数参数通常是const的,但是const并不是严格必须的

        C、在下面几种情况会调用拷贝构造函数

               a、显示或隐式的地用同类型的一个对象来初始化另外一个对象

               b、作为实参以值传递

               c、在函数体内返回一个对象时

               d、需要产生一个临时类对象时(类对象作为函数返回值会创建临时对象)

5 、函数指针

1、简单回顾函数指针用法

#include <iostream>
using namespace std;
int add(int i,int j)
{
	return i + j;
}

int main()
{
	//1
	int (*pFun)(int,int) = add;
	int tmp = pFun(2,3);
	
	//2
	typedeff int (*AddP)(int,int);
	AddP funcP= add;
	tmp = funcP(2,3);
	cout<<tmp<<endl;
}

注意:

A、常借助于typedef类型定义简化函数指针的定义

B、函数名代表函数的入口地址,在为函数指针赋值时,funcp = add 和funcp = &add都是正确的

C、“回调函数”可以理解成通过函数指针调用的函数

函数指针作为参数传递

#incluce <iostream>
using namespace std;
int f()
{
    return 1;
}
//显式
void invoke0(int (*func)())
{
    cout<<(*func)()<<endl;
}
//隐式
void invoke1(int func())
{
    cout<<func()<<endl;
}
int main()
{
    invoke0(f);
    invoke1(f);

    return 0;
}

2、 指向类成员函数的函数指针用法

(1)函数指针指向类静态成员

        函数指针 = 类名::函数名

        C++沿用C语言中对函数指针的定义和使用规范,对于类静态成员函数,可以理解为“作用域受限的外部函数”

(2)函数指针指向类非静态成员

       函数指针要以  对象的“成员指针”的形式定义和赋值。

6、操作符重载

1、输入、输出操作符重载

      输入、输出操作符重载都只能采用友元函数的形式进行,但不能将operator>>() 或operator<<()声明为istream类或ostream类的成员函数。

这是因为其是C++标准库的类,不能被用户随意修改。所以,要从标准输入对象、输出对象将数据读入类或从someClass的对象输出到标准

输出对象,只能重载为全局函数。

ostream& operator <<(ostream&, const someClass& );

istream& operator >>(istream&, someClass& );

//举例
#include <iostream>
using namespace std;

class Complex
{
private:
    double real;
    double image;
public:
    Complex(double r=0,double i=0):real(r),image(i){ }
    
    friend ostream& operator<<(ostream&, const Complex& );
    
    friend istream& operator>>(istream&, Complex& );

};

ostream& operator<<(ostream& o, const Complex& c)
{
    o<<c.real<<"+"<<c.image<<"i";
    return 0;
}

istream& operator>>(istream& i, Complex& c) //注意不能加const
{
    
}

int main()
{

    return 0;
}

注意:

(1)对于输入、输出操作符重载,只能采用友元函数形式,而不能采用成员函数形式

(2)输出比较容易,输入需要做容错处理,详细可参考《cin的详细用法》

2、赋值操作符重载

将两个同类型变量的值从一端(右端)传到另一端(左端)。但以下两种情况下需要重载赋值操作符:

1)赋值号两边的表达式不同,且无法进行类型转换

2)需要进行深拷贝

赋值操作符智能通过类的成员函数的形式重载。

注意:

1)由于深拷贝会涉及内存的动态分配和释放等一些较为复杂的操作,所以程序员在编写自定义类时要尽量避免深拷贝的出现。

可以将类中的字符串定义为string name; 而不使用char *name,就可以避免自己编写实现深拷贝的代码。实际的深拷贝工作

是由string类来完成的,而string类是由C++标准库提供的,所以我们可以放心使用

2)对赋值操作符进行重载时,通常将操作符的返回值定义为赋值值操作数类型的引用,可以实现对赋值表达式的求值和链式操作。

7 、函数重载、隐藏、覆盖和重写的区别

7.1 函数重载

1)函数重载定义

      同一作用域中,当同名函数的形式参数(参数个数、类型或者顺序不同时),构成函数重载

2)注意事项:

a) 函数返回值类型与构成函数重载无任何关系;

b) 类的静态成员函数与普通成员函数可以形成重载;

c) 函数重载发生在同一作用域,如类成员函数之间重载、全局函数之间重载

7.2 函数隐藏

本资源是压缩包形式的, 里面包含 本书,里面是pdf格式的, 带书签目录,本书是完整版的。 资源都是我自己用过的,不骗大家。 本书作者: 肖俊宇 吴为胜; 出版社: 电子工业出版社 内容简介: 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》是C++语言的入门教程,较为系统地介绍了C++语言的基础内容。本书共分为3篇22章,详细介绍了C++语言的基础知识、面向对象、标准模块、底层开发和综合案例。本书循序渐进地讲述了C++的基础知识、C++程序的组成及其开发过程、C++程序中的数据、表达式和语句、控制程序流程、数组与字符串、指针与引用、使用函数函数模板、错误和异常处理、宏和预编译、面向对象的开发、封装、继承、多态、类模板、文件流、标准模板库STL和编程实践等内容。 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》涉及面广,从基本知识到高级内容和核心概念,再到综合案例,几乎涉及C++开发的所有重要知识。本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 C++基础篇 第1章 C++概述 1 1.1 引言 1 1.1.1 C++的历史沿革 1 1.1.2 入门C++ 2 1.1.3 编程思想的转变 3 1.2 C++概述 4 1.2.1 C++的特征 5 1.2.2 C与C++的比较 5 1.2.3 C++的应用领域 6 1.3 C++源程序的组成 6 1.3.1 基本组成元素 7 1.3.2 标识符 8 1.3.3 保留字 8 1.3.4 符号 8 1.4 C++集成开发环境——DEV-C++ 9 1.4.1 选择C++编译器 9 1.4.2 安装DEV-C++ 10 1.4.3 DEV-C++ IDE简介 11 1.5 第一个C++程序——Hello World 11 1.5.1 创建源程序 11 1.5.2 编译运行 13 1.6 小结 14 1.7 习题 14 第2章 变量与数据类型 18 2.1 常量和变量 18 2.1.1 常量 18 2.1.2 变量 21 2.1.3 变量的定义及赋值 22 2.1.4 变量的应用示例 24 2.2 基本数据类型 25 2.2.1 基本数据类型概述 25 2.2.2 整型数据类型 26 2.2.3 浮点型数据类型 27 2.2.4 字符型数据类型 29 2.2.5 布尔型数据类型 30 2.3 变量的作用域 31 2.4 类型转换 32 2.4.1 隐式转换 32 2.4.2 显式转换 33 2.5 小结 34 2.6 习题 34 第3章 表达式与语句 39 3.1 运算符 39 3.1.1 运算符概述 39 3.1.2 算术运算符 40 3.1.3 自增和自减运算符 42 3.1.4 赋值运算符 43 3.1.5 关系运算符 44 3.1.6 逻辑运算符 45 3.1.7 条件运算符 46 3.1.8 逗号运算符 47 3.1.9 位运算符 48 3.1.10 sizeof运算符 49 3.2 运算符的优先级和结合性 50 3.3 表达式 51 3.4 语句 53 3.4.1 空格的作用 53 3.4.2 语句块 54 3.4.3 赋值语句 55 3.4.4 空语句 56 3.5 小结 57 3.6 习题 57 第4章 流程控制结构之顺序结构 63 4.1 程序流程图 63 4.2 表达式语句 64 4.3 格式化输入/输出 65 4.3.1 标准输入流cin 65 4.3.2 标准输出流cout 66 4.3.3 输出流cerr和clog 68 4.4 格式控制函数 69 4.5 格式控制符 71 4.5.1 控制不同进制的输出 72 4.5.2 控制输出宽度 72 4.5.3 控制输出精度 73 4.6 顺序结构综合应用 74 4.7 小结 75 4.8 习题 75
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值