C++ 学习笔记 - Week1 【Boolan.com】
1、C++简介
1.1 课程名称
- C++面向对象程序设计(Object Oriented Programming,OPP)
1.2 课程目标
- 培养正规的、大气的变成习惯
- 以良好的方式编写C++ class -- 基于对象
- 学习Classes之间的关系 -- 面向对象
- 继承(inheritance)
- 复合(composition)
- 委托(delegation)
1.3 三个实例代码
- complex
- string
- oop-demo
1.4 C++历史
- B语言(1969)
- C语言(1972)
- C++Y语言(1983)
(new C -- C with class -- C++) - 其他面向对象语言Java C#
- C++演化
- C++ 98(1.0)
- C++ 03(TR1,Technical Report 1)
- C++ 11 (2.0)
- C++ 14
1.5 C++的组成
- C++语言
- C++标准库
1.6 推荐书籍
- 《The C++ Programming Language》
- 《C++ Primer》
- 《Effective C++》《改善程序技术与设计思维的55个有效做法》
- 《The C++ Standard Library》
- 《STL 源码剖析》
2、头文件与类的声明
2.1 C vs. C++ 关于数据和函数

- C语言中,根据(Data)数据类型创建数据(Variables),函数(Fuctions)处理数据。数据必须是全局的。
- C++中,把数据和处理数据的函数包在一起,称为Class,相当于C中的Struct。C++中的结构几乎等同于Class。C++以Class为类型创建对象(Object)。
2.2 C++,关于数据和函数
- Class的经典分类:带指针和不带指针。
- complex函数无指针,所有的数据(如实部、虚部)存在于明确的内存中。
- string函数含有指针,其数据其实是指针(ptr)指向一串字符串。
2.3 C++代码的基本形式
头文件 + 主程序 + 标准库
- 标准库和头文件后缀为.h;主程序后缀名为.cpp。
- 主程序使用标准库采用#include<iostream.h>的形式。
- 主程序使用头文件采用#include"complex.h"的形式。
2.4 输出( cout )
cout 函数包含于标准库<iostream.h>
#include<iostream.h>
using namespace std;
int main()
{
int i = 7;
cout << "i=" << i << endl;
renturn 0;
}
2.5头文件中的防卫式声明
#ifndef _COMPLEX_
#define _COMPLEX_
..... //主体程序
#endif
//如果未定义过" _ COMPLEX _ ",则定义" _ COMPLEX _ "
2.6头文件的主体部分
- 前置声明
- class声明
- class定义
2.7class template
-
模版的建立
template
//定义模版数据类型名T
class classname
{
public:
....
private:
T tag1,tag2;
friend .....
}; -
模版的使用
{
classnamec1(2.5,1.5);
classnamec2(1,2);
}
3、构造函数
3.1 内联函数(inline)
- 函数若在class body内定义完成,则自动成为inline函数。
- inline函数有宏的特性,但没有宏的缺点。
- 如果函数太复杂,编译器则无法定义未inline函数。
- 函数是否为inline函数,由编译器决定。
3.2 访问级别
- public :部分为公共部分,外界可见,通常为函数。
- private :只class内部可见,通常为数据和内部处理函数。
3.3 构造函数
用于完成成员的初始化工作
-
函数名称一定和类名称相同。
-
函数可以有默认实参。
-
构造函数没有返回类型。
-
构造函数拥有初始列(initialization list)。
-
构造函数不能在程序中直接调用,只能用于创建对象。
-
构造函数可以有很多个,称为重载。
-
不允许被应用的构造函数可以放在private中。
-
构造函数模式
- complex (double r = 0, double i = 0)
- re(i), im(i)
{}
3.4 常量成员函数
在C++编程中,如果声明类的成员函数时,在末尾加上const修饰,则该成员函数称为类的常量成员函数。
常量成员函数不可以改变数据的函数。
class complex
{
public:
complex (double r = 0, double i = 0)
:re (r), im(i)
complex real() const { return re; }
complex imag() const { return im; }
private :
double re, im;
friend complex& _doapl (complex*, const complex&);
}
类函数中,如过在函数complex real()和complex imag()中没有使用const修饰函数。则表示外部可以修改类函数中的值,则为非常量成员函数。
{
const complex c1(2,);
cout << c1.real();
cout << c1.imag();
}
而如果使用以上方法调用函数,则会出现编译错误。
3.5 参数传递方法
3.5.1 通过数据传递
- 通过直接给参数赋值的方法。
complex (double r = 0, double i = 0);
:re (r), im(i);
3.5.2 通过引用传递参数
- 通过指针传送数据的地址给函数。
operator << (ostream& os);
3.5.3 通过引用传递常量参数
complex& operator += (const complex&);
3.6 友元(friend)
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。
相同class的各个object互为friend
声明
frined complex& _doapl (complex*, const complex&);
引用
inline complex&
__doapl (complex* ths, const complex& r)
{
ths -> re += r.re;
ths -> im += r.im;
return ths;
}
3.7 操作符重载
当操作符重载函数作为类的成员函数时,操作符重载函数的参数会比作为友元或者独立于类的操作符重载函数少一个参数,因为操作符重载类成员函数把调用该函数的对象作为函数的第一个参数,也就是隐含的this指针指向调用该函数的第一个对象,所以会少一个参数。
3.8 临时对象
typename();

浙公网安备 33010602011771号