最初的C++称为“带类的C”,扩展了C语言的不少功能。在C++语言中,仍然可使用C语言中的struct
定义结构。ios
struct 结构名{ 类型 变量名; 类型 变量名; ... }
在C++中,聚合类是一种特殊类型的类,用户能够直接访问其成员,而且具备特殊的初始化语法形式(能够提供一对花括号括起来的成员初始值列表初始化聚合类的数据成员)。c++
聚合类应当知足的条件:算法
public
类型的(任何状况下,对象均可以经过成员运算符访问成员);举个例子,定义一个聚合类Data
:数组
struct Data{ int ival; string str; };
初始化能够这样:函数
Data dval = {8,"Smith"};
注意:初始值的顺序必须与成员声明的顺序一致。初始值列表中元素的个数若是少于类的成员数量,则靠后的成员被值初始化。初始值列表中元素的个数绝对不能少于类的成员数量。工具
C++中的struct
不只能够包含数据,还能够包含函数。spa
举个例子:设计
#include<iostream> using namespace std; struct Complex{ double real; double imag; void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} }; int main(){ Complex c; c.init(2,3); cout <<c.getReal() <<"+" <<c.getImag() <<"i" <<endl; return 0; }
小提示:在结构中数据成员后面带分号,函数成员后面是不带分号的,可是函数成员内须要带分号,结构反括号后面也是要加分号的,main
结束是不加分号的。指针
说明:结构中的数据和函数称为成员,real
、imag
是数据成员。定义Complex
结构后,就能够用它来定义变量,并能经过成员运算符访问它的成员函数。code
为了实现信息隐藏,限制对结构中某些成员的非法访问,C++增高了3个访问权限限定符,用于设置结构中数据成员和函数成员的访问权限。
public
被设置为public
权限的成员(包括数据成员和函数成员)称为类的公有成员,可被任何函数访问(包括结构内和结构外的函数)。
private
被设置为private
权限的成员(包括数据成员和函数成员)称为类的私有成员,仅供结构(类)的内部(自身成员函数)访问。
protected
protected
与继承有关。供结构(类)的内部及后代(派生类)访问。
在C和C++中,若是没有声明访问权限,默认的访问权限是public
。若是不想让外部直接访问须要加个private
声明为私有类型。C++结构的定义形式:
struct 类名{ [public:] 成员; private: 成员; protected: 成员; };
类(class)具备信息隐藏的能力,可以完成接口与实现的分离,用于把数据抽象的结果封装成能够用于程序设计的抽象数据类型。是面向对象程序设计中通用的数据封装工具。在C++中,class
具备与struct
彻底相同的功能,用法一致。类是默认private
。
类也是一种自定义数据类型,用关键字class
表示,用法与struct
相同,形式以下:
class 类名{ [private:] 成员; public: 成员; protected: 成员; };
类名一般首字符大写的标识符表示 ;一对花括号界定了类的范围;最后的分号必不可少,表示类声明结束。
举个例子:
class Complex { private: double real,imag; public: void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} void print(){ cout <<c.getReal() <<"+" <<c.getImag() <<"i" <<endl; } };
对于类定义须要注意的问题:
访问说明符
对于类声明中的访问说明符private
、public
和protected
没有前后主次之分,也没有使用次数的限制。只是出于信息隐藏的目的,将数据成员设置为private
权限,将须要让外部函数访问的成员设置为public
权限。
类做用域
class
或struct
后面的一对花括号包围的区域是一种独立的做用域,称为类域。类域内的数据和函数都称为成员(数据称为数据成员,函数常被称为成员函数)。同一类域内的成员是不爱访问权限和前后次序的限制,相互间能够直接访问。
关键字struct和class
C++的struct
也是一种类,它与class
具备相同的功能,用法也是彻底相同。惟一区别是在没有指定成员的访问权限时,默认的权限是不同的。
类是对客观世界中同类事物的抽象,它给出了属于该类事物共有的属性(数据成员)和操做(成员函数)。
类具备封装特性。
抽象是对具体对象(问题)进行归纳,抓住问题的本质,抽出这一类对象共有的性质,并加以描述的过程,抽象主要包括数据抽象和过程抽象。
抽象与封装的区别:抽象是一种思惟方式,而封装是一种基于抽象性的操做方法。通常经过抽象,把所获得的数据信息以封装的技术将其从新整合,造成一个新的有机体,这就是类。
类的数据成员能够是任何数据类型,如整型、浮点型、字符型、数组、指针和引用等,也能够是另一个类的对象或指向对象的指针,还能够是自身类的指针或引用,但不能是自身类的对象;能够是const
常量,但不能是constexpr
常量;能够用decltype
推断类型,但不能使用auto
推断类型;数据成员不能指定为extern
的存储类别。
C++支持在定义类的同时为类的数据成员赋初始值,举个例子:
class X{ private: int a = 2; int y = {3}; int b[3] = {1,2,3}; const int ci = a; public: ... }
注意:类的定义或声明只是在程序中增长的自定义数据类型,是没有分配相应的内存空间。只有在实例化时,才会分配相应的空间,也才会在这时初始化数据成员。
类的成员函数也称为方法或服务。它能够在类内定义,也能够在类外定义;能够重载,也可使用默认实参。
成员函数的定义
类的成员函数有两种定义方式:
声明类时就给出成员函数的定义。
class Complex { private: double real,imag; public: void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} };
在声明类时,只声明成员函数的原型,而后在外部定义成员函数。类外定义函数格式
返回类型 类名::成员函数名(参数列表);
其中,::
是做用域运算符,用于说明这里定义的函数是指定类中的一个成员函数。
class Complex { private: double real,imag; public: void init(double r,double i); double getReal(); double getImag(); }; void Complex::init(double r,double i){ real = r; imag = i; } void Complex::getReal(){ return real; } void Complex::getImag(){ return imag; }
const(常量)成员函数
为了禁止成员函数修改数据成员的值,能够将它设置为const
(常量)成员函数。设置的方法是在成员函数形参列表的后面加上关键字const
,格式以下:
class X{ T f(T1,T2,...) const; };
说明:T
是函数返回类型,f
是函数名,T1
,T2
是各参加的类型。将成员函数设置为const
类型后,代表该成员函数不会修改任何成员的值。
注意:只有类的成员函数才能指定为常量,通常的函数是一能的。const
成员函数与const
参数是不一样的。
成员函数的重载与默认实参
类的函数是能够重载,也能够指定默认实参。
在外定义的函数,只能在声明时或类外定义成员函数时才能指定默认实参,但不能在声明和定义中同时指定。
嵌套类型是在类中定义的类、枚举、使用typedef
声明为成员的任意类型以及使用using声明的类型别名。
嵌套类
class X{ ... class Y{ //Y是在X类定义的嵌套类 ... } };
class X{ ... public: class Y; //Y是X的嵌套类,定义在外层类以外 }; class X::Y{ //Y是在X类外定义的嵌套类 ... }
类型别名
在类内部可使用typedef
和using
声明类型别名。
typedef T alias; using alias = T;
经过class定义的类型称为类类型,由类类型定义的变量称为对象。
不一样类类型的对象不能进行自动相互转换,即便两个类具备彻底相同的成员列表,它们也是不一样类型,是不能进行自动类型转换。
能够直接把类名做为类型的名字来用,从而直接指向类类型。也能够把类名跟关键字后面来使用。
Complex c; //默认初始化Complex类型的对象 class Complex c; //等价声明
类的声明和定义是能够分开的,能够先声明类,而暂时不定义它。
class C; //C类的声明
类是对同类事物的一种抽象,这类事物中具体的一个实例就把它看做一个对象。类和对象的关系就是数据类型和变量的关系。
对象的定义
用类定义对象的形式以下:
类类型名 对象名;
类类型是一种自定义类类型,能够定义类型的变量,也能够定义类类型的指针和引用。
Clock* p = &cl1; //定义Clock类的指针p指向对象cl1 Clock& r = cl2; //定义Clock类的引用r指向对象cl2
对象对成员的访问
类中成员之间能够相互访问,不受访问说明符的限制,能够直接使用成员名。类外使用只能使用“对象名.成员名”访问具备public访问说明符的成员。对象引用方法与结构类似,必须用成员运算符“.”做为对象名和对象成员之间的间隔符,格式以下:
对象名.数据成员名 对象名.成员函数名(实参列表) clk1.setHour(12); clk1.print();
说明:类外只能访问对象的公有成员,不能访问对象的私有和受保护成员;若是定义的对象指针,在经过指针访问对象成员时,要用成员运算符“->”做为指针对象和对象成员之间的间隔符。
对象间的赋值
不一样类类型的对象之间不能互相赋值。同类的不一样对象之间,以及同类的指针之间能够相互赋值。
对象名1 = 对象名2;
说明:进行赋值两个对象类型必须相同;进行数据成员的值复制,赋值以后,两不相干。