C++语言的特性
类与对象
类的概念及基本语法
-
类是一个具有相似特性的物体集合,其中具体的一个物体就被称作为对象。
例子:所有手机可以被定义为一个类,每个手机都可以被称为一个对象。对于一类物体,我们可以施以同样的操作,比如开关机、调整手机的亮度等,以上被称为这个类的方法,我们可以使这个类执行这些方法。但对于每一个对象,他们可以有不同的属性,对于手机而言,他们可能存在不同的运营商,不同的电量等属性。
- 从类到对象的过程,我们称为实例化。
- 对于类而言,有共同特点(变量)、归纳行为(函数)
- 构成数据结构、操作数据结构
- 类与结构体的区别
定义类
class Rectangle{
public:
int w,h;
int area(){
return w*h;
}
int perimeter(){
return 2 * (w + h);
}
void init(int w_, int h_){
w = w_; h = h_;
}
};//分号
使用类
int main(){
int w, h;
Rectangle r; // r是一个对象
cin >> w >> h;
r.init(w, h);
cout << r.area() << endl << r.perimeter();
return 0;
}
如果是像定义变量一样定义的类,则需要用“.”来使用类的成员函数;如果是定义的类是一个指针,则需要用“->”来调用类的成员函数;如果是通过引用来定义的类,则需要用“.”来使用类的成员函数。
同时,我们也可以将声明和定义分离
class Rectangle{
public:
int w,h;
int area();//成员函数的声明
int perimeter();
void init(int w_, int h_);
};//分号
int Rectangle::area(){return w*h;}
int Rectangle::perimeter(){return 2*(w+h);}
void Rectangle::init(int w_, int h_){w = w_; h = h_;}
“::”表示area()这个函数是Rectangle这个类的成员函数;
-
访问权限:private(只能在成员函数中访问),public(可以在任何地方访问),protected
举个例子:对于手机这个类来说,手机电量这个变量就应该被设计为private的,不然用户自身可以随意电量
默认函数
当我们生成一个类的时候,会有一些函数默认生成(基本操作):
- 构造函数与析构函数
- 复制操作(复制构造函数)
- 取地址
this指针
this指针:并非对象的成员,是常量指针;每个对象可以使用this指针访问自己的地址,但this并不是这个类的真实成员(sizeof来看类的真实大小,this是不计数的);非static成员函数调用时,this指针为隐式参数
用途:防止字符值、返回以连续调用
this的例子
class complex{
float real,imag;//默认是private
public:
complex * returnaddress(){
return this;
}
float returnreal(){
return this -> real;
}
}
函数模板与类模板
对于不同的数据类型,我们设计的算法通用,对于每一个数据类型都定义一个函数是麻烦的,函数模板解决了这个问题。
一个应用于输出函数的例子
template<class T>
void print(const T array[], int size){
int i;
for(i = 0; i < size; i++)
{
cout<<array[i];
}
}
在定义类的时候给它一个或多个参数,这些参数表示不同的数据类型。在调用类模板时,指定参数,由编译系统根据参数提供的数据类型自动产生相应的类模板。
类模板的定义
template <class T>
class C{
T * ptr;
int size;
public:
C(int length);
~ C();
int len();
void setElement(T arg, int index);
T getElement(int index);
}
在使用类模板声明对象
C <int> arrayInt(50), *ptrArray;
创建一个元素类型为int的C模板类,并声明该模板类的一个对象以及一个指针。
流
标准输入输出流
- 标准输入流
cin >> x;
读入整型数时以第一个非数字为终结;读入字符串时以第一个空格、tab或者换行符为终结 -
标准输出流
cout << y;
-
流操作算子
cout << setprecision(6) << x << endl;
(float)保留有效数字
cout << setiosflags(ios::fixed) << setprecision(6)......
保留小数点后几位
cin.width(5)
设置输入宽度,只对之后的一句有效