C++ 网页学习
1.2
C中struct
和C++中class
区别,class
有成员函数。
实例化
用类创建对象,称作类的实例化,这个对象也称作类的实例(instance)
类的成员有时称类的属性, property,成员函数有时称方法, method。
面向对象编程
Object Oriented Progremming, OOP.
1.4
定义名称空间用namespace
关键字。
namespace Zhou{
Int own = 10000;
}
域解析操作符
::
, 用来指明要使用的名称空间。
using Zhou::own; #声明名称空间中的一个变量
using namespace Zhou; #声明整个名称空间
中大型程序开发不推荐把名称空间声明在外部,这样会增加命名冲突的风险。
1.8
C++布尔类型
bool
类型,一般长度占1个字节,有两个值true
和false
, true代表真,false代表假。
可以使用true和false显式赋值:
bool flag = true;
2.3
成员访问限定符
public``protected``private
, 分别表示公有的,受保护的,私有的,被称为成员访问限定符。
访问权限,就是指你能不能使用该类中的成员。
成员函数的定义和声明一般也会分开。
对public
和private
的理解。
public
指可以通过对象进行访问和修改,你可以在类外使用public
定义的成员。
private
指不能够使用对象访问和修改,你不能在类外使用,只有在类那个大括号内,才能使用private
成员。
可以使用public
的成员函数修改private
的成员。
成员变量大都以m_
开头,这是约定俗成的写法。以m_
开头可以一眼看出这是成员变量,又可以和成员函数中的形参名字区别开。
声明为protected
,则只能在派生类内部可以使用。
给成员变量赋值的函数通常称为set函数,他们的名字通常以set
开头。
读取成员变量的值的函数通常称get函数,他们的名字通常以get
开头, 然后根跟成员变量的名字。
类的封装性
这种将成员变量声明为private
,将部分成员函数声明为public
的做法。
声明为public和private的顺序任意,若没有public和private关键词,则默认为private
2.6
构造函数
名称和类相同,没有返回值,在创建对象时自动执行。
想要调用构造函数,就得在创建对象时传递实参。
构造函数必须是public属性,不然无法调用。
构造函数不允许出现返回值和return。
构造函数的重载
一个类可以有多个重载的构造函数。
构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象是就一定要调用.
默认构造函数
用户没有自己定义构造函数时,由编译器自动生成。
调用没有参数的构造函数时可以省略括号。
初始化列表
格式:
Stedunt::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
...
}
使用构造函数列表仅仅是书写方便。
初始化const成员变量的唯一方法是使用初始化列表。
析构函数
destructor,一种特殊的成员函数,没有返回值,在销毁对象时自动执行。
析构函数的名字是在类名前面加一个~
符号。
析构函数没有参数,不能被重载,,因此一个类只能有一个析构函数。
C中的malloc()和free()
与C++中的new()和delete()
的区别
用new分配内存时会调用构造函数,用delete释放内存时会调用析构函数。
创建于堆区的对象需要手动delete,
析构函数,如果我们不自己写,编译器会自动生成一个,但什么都不会干。
全局区的对象在程序一开始创建,程序结束时才会被销毁。栈区的对象在调用函数时才创建,在函数结束时销毁,在堆中开辟空间创建的对象必须手动delete。
2.11
C++ this指针
this
是C++关键字,代表一个const指针,指向当前对象,可以通过它访问对象的成员。
this
只能用在类内部,通过this
可以访问类的所有成员,包括public,protected,private。
重载运算符 operator
关键字operator
,重载操作符。
和运算符如=
一起使用。
用来重载一个运算符,运算符就是< , >, =, 这一类。让它可以作用于类上。
例子:
bool operator= (int value) {
. . .
}
和定义函数一样,前面的bool
是返回值类型,operator=
相当于函数名,(int value)
是参数列表,{...}
是函数主体。这个就是重载了等号=
.
一个具体的例子:
# 这里operator>为成员函数类懒得写了。
bool operator> (int value) {
if (this->own > value)
return ture;
else
return false;
}
int main(void)
{
person p1(10);
if (person > 5)
printf(“He has a lot of money!”);
.
.
.
}
#这里的person会自动调用重载后的>,也就是函数operator>, 然后5就是传入的实参。
也可以把重载运算符函数声明为非成员函数。
C++要求,‘=’,‘[]’,’()’,’->’运算符必须被定义为成员函数。
几点限制:
- 实现运算符重载时,需要注意以下几点:
- 重载后运算符的操作数至少有一个是用户定义的类型;
- 不能违反运算符原来的语法规则;
- 不能创建新的运算符;
- 有一些运算符是不能重载的,如“sizeof”;
- =、()、[]、-> 操作符只能被类的成员函数重载。
4.1
C++继承和派生
继承, inheritance, 就是一个类从另一个类中获取成员函数和成员变量。
派生, derive, 和继承是一个概念。
父类和子类一般搭配称呼。
基类和派生类一般搭配称呼。
派生类可以定义自己的新成员。
语法格式:
class Student: public People {
. . .
}
三种继承方式
有三种继承方式,public,private,protected,默认为private。
类成员访问权限的高低:
public → protected → private
protected的变量可以在派生类中使用。
继承方式中的public,protected,private是指明基类成员在派生类中的最高访问权限。
protected的成员也不能通过对象访问。
实际开发中一般使用public
在派生中访问基类的private成员的唯一方法就是借助基类的非private的成员函数。
改变权限
可以使用using
改变权限。
C++继承时名字遮蔽问题
如果派生类中的成员和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。
此时访问基类的成员就要使用类名和域解析符::
。
基类成员函数和派生类成员函数不构成重载.
5.1
C++多态和虚函数
基类的指针只能用来访问派生类的成员变量,但不能访问派生类的成员函数。
为了让基类指针能够访问派生类的成员函数,C++新增了虚函数,vitual function。
关键词virtual
.
有了虚函数之后,基类指针指向基类对象时就能使用基类的成员,指向派生类时就能够使用派生类的成员。
换句话说,基类指针既能够按照基类的方式做事,又能够按照派生类的方式来做事,它有多种形态,或者说多种表现方式,我们将这种现象称为多态,Polymorphism。
也就是虚函数是实现多态的一种方式。
多态是面向对象编程的主要特征之一.