c++学习记录(二)
c++面向对象之类&对象
c++有面向对象开发的四大特征:封装、抽象、继承、多态。类是c++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,所有东西都可以是对象,类中的数据和方法称为类的成员,如一个类中的函数是类的成员。
(1)定义类、对象以及访问数据成员
定义类
定义类需要使用关键字class,格式如下:
\\class name
{
访问修饰符:
body
};
面向对象编程中数据封装防止函数直接访问类类型的内部成员。类成员访问限制通过访问修饰符实现,访问修饰符介绍如下表:
修饰符类型 | 关键字 | 作用 |
---|---|---|
公有成员 | public | 不使用成员函数而可以设置和获取公有变量的值 |
私有成员 | private | 私有成员在类外部不可访问,只有使用成员函数和友元函数才能访问 |
保护成员 | protected | 与私有成员相似,但可以在子类中访问 |
定义对象
类似在基本类型中定义变量
\\name xname; //name为类名,xname为对象名
访问数据成员
类的公共数据可以直接使用访问运算符.来访问,而私有和保护成员要使用成员函数进行访问。
(2)类成员函数
类成员函数指定义和原型写在类定义内部的函数。成员函数可以定义在类定义内部,或者单独使用范围解析运算符::来定义。如:
\\class name #直接在类定义内部定义函数
{
public:
double function()
{
body
}
};
double name::function() //在类外部使用范围解析运算符::定义函数
{
body
}
(3)类构造函数&析构函数
类构造函数
构造函数与类的名称相同,它会在每次创建类的新对象时执行,若不自定义则会默认定义,不会返回任何类型。构造函数可用于为成员变量设置初始值。需要时,构造函数也可以带参数。
\\class name
{
public:
name(); //这是构造函数,可加参数
};
类构造函数还可使用初始化列表来进行快速初始化变量
\\name::name(double a,double b,double c):X(a),Y(b),Z(c)
{
body
}
//类似于下代码
name::name(double a,double b,double c)
{
X=a;Y=b;Z=C;
body
}
类的析构函数
类的析构函数与类的名称相同,只是需要在前加上符号~,它会在每次删除所创建的对象是执行,同样不会返回任何值。析构函数作用是在跳出程序前释放资源。
\\class name
{
~name(); \\这是析构函数
}
(4)拷贝构造函数
拷贝构造函数在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。通常用于:
·通过使用另一个同类型的对象来初始化新创建的对象
·复制对象把它作为参数传递给函数
·复制对象,并从函数返回这个对象
如果类带有指针变量并由动态内存分配,则必须有一个拷贝构造函数,格式如下:
\\classname(const classname &obj)
{
body
}
具体拷贝构造函数是什么意思,怎么用?我还搞不清楚,就简单记住一些我能看懂的。
(5)友元函数
类的友元函数是定义在类外部,能访问私有和保护成员的函数,但友元函数并不是成员函数。友元可以是一个函数,也可以是一个类。友元类中所有成员都是友元的(那友元类中能有函数吗?这个函数是不是成员函数?)。声明类定义中友元,需要使用关键字friend
\\friend 数据类型 function;
(6)内联函数
如果一个函数是内联函数,在编译时,编译器将把该函数的代码放置在每个调用该函数的地方。因此内联函数是一种以空间换时间的方法,即空间消耗增加,时间消耗减少,且每一次修改内联函数都需要重新编译。内联函数需要在函数名前门加关键字inline。在类定义中定义的函数都是内联函数,默认使用inline关键字。内联函数有以下注意:
·一般都是10行一下的小函数
·内联函数内不允许使用循环语句和开关语句
·内联函数的定义必须出现在内联函数第一次调用之前
·类结构中所在的类说明内部定义的函数是内联函数
(7)this 指针
c++中this指针是所有成员函数的隐含参数,因此this指针可以用来调用对象,但友元函数没有this指针,因此友元函数不是成员函数。this指针在成员函数中用法与指针类似。
(8)类的静态成员
使用static关键字把类成员定义为静态。静态成员在类的所有对象中共享。静态成员的初始化不能放置在类的定义中,但可以在类的外部通过使用范围解析运算符::来初始化。
静态成员函数
静态成员函数在类对象不存在的情况下也能调用,只要使用类名加范围解析运算符::就可以访问。但是这会让静态成员函数与普通成员函数产生区别。