#内联函数,重载函数,缺省函数
1.为了提高效率,可以在函数定义时候前面加上inline即可以将函数改为内涵函数
2.重载函数,函数名字可以相同,在调用的时候保证没有二义性即可
3.声明函数的时候就可以位函数的形参赋值,这样的函数叫做缺省函数
#c++类和对象的基本概念
类成员的可访问范围(在类的定义中)
*private* :私有成员,只能在成员函数内访问
>私有成员的特点,只能在类里面访问(主函数中试图访问是错误的),目的是强制对成员变量的访问一定要通过成员函数进行,
那么以后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所以直接访问成员变量的语句
都需要修改
*public*: 公有成员,可以在任何地方访问
*protected*:保护成员
(如果某个成员前面没有关键字,则缺省被认为是私有成员)
#构造函数
1.名字与类名相同,可以有参数,不能有返回值
2.作用是对对象进行初始化,如给成员变量赋值
3.如给定义类时没有写构造函数,则编译器会生成一个默认的无参数的构造函数
4.*对象生成的时候构造函数自动被调用。对象一旦生成,再也不能在其上执行构造函数
5.一个类可以有多个构造函数
#赋值构造函数
1.只有一个参数,即对同类对象的引用
2.x::x(const x&)*关于const,如果希望确保实参的值在函数中不应被改变,则可以加上关键字const
3.如给没有定义复制构造函数,那么编译器生成默认复制构造函数。默认的复制构造函数完成复制功能
**赋值构造函数**起作用的三种情况
1.当用一个对象去初始化同类的另一个对象
2.如果某函数有一个参数是类a的对象,那么该函数被调用时,类a的复制构造函数将被调用
3.如果函数的返回值是类a的对象时,则函数返回时,a的复制构造函数将被调用
注意:当对象赋值并不导致复制构造函数被调用
#类型转换构造函数
1.目的是实现类型的自动转换
2.只有一个参数,并且不是复制构造函数的构造函数,一般就可以看作是转换构造函数
3.当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象
#析构函数
1.名字与类名相同,在前面加~,没有参数和返回值,一个类最多只有一个析构函数
2.析构函数对象消亡时即自动被调用,可以定义析构函数来在对象消亡前做善后工作,比如释放分配的空间
3.如果定义类时没有写析构函数,则编译器会生成缺省的析构函数,缺省析构函数什么也不做
4.如果定义了析构函数,则编译器不在生成缺省析构函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include<iostream> using namespace std; class crectangle{ 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_; } crectangle(int w_,int h_){//构造函数 w=w_;h=h_; } crectangle(){ //也是一个构造函数,重载构造函数,目的当声明对象不带参数时候,编译器自动调用它 cout<<"1"<<endl; } crectangle(const crectangle &r){ //复制构造函数 w=r.w;h=r.h; cout<<"copy constructor called"<<endl; } };//一个关于矩形的对象定义完成 int main(){ int w,h; cin>>w>>h; crectangle r(w,h);//r是一个对象 r.init(w,h);//调用初始化函数对其进行初始化 cout<<r.area()<<endl<<r.perimeter(); // return 0; cout<<endl; //通过类,可以定义变量。对象的内存的分配:和结构变量一样 //对象占用的内存空间的大小等于所以成员变量的大小之和 //访问对面的成员名,1 直接使用.访问 //2. 用class类名声明一个指针,crectangle *p= &r p->w 可以直接访问 //3. 引用访问 crectangle &rr=r rr.w就可以直接访问 crectangle r2; crectangle r3[2]={{3,4}}; crectangle r4(r2);//调用复制构造函数 ,r4对象是r2的一个复制品 } //类的成员函数可以放到外面来写 //例如 int crectangle::rear(){...} |
析构函数和构造函数的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include<iostream> using namespace std; //构造函数和析构函数的应用实例 class demo{ int id;//私有成员 public: demo(int i){ //类型转换构造函数 id=i; cout<<"id="<<id<<"构造函数"<<endl; } ~demo(){//析构函数 cout<<"id="<<id<<"析构函数"<<endl; } }; demo d1(1);//全局变量声明了d1对象 void fun(){ static demo d2(2);//静态局部变量(在函数结束时候,变量不消亡) demo d3(3); cout<<"func"<<endl; } int main(){ demo d4(4); d4=6; cout<<"main"<<endl; { demo d5(5);//这是一个局部变量, 大括号结束,局部变量消亡 } fun(); cout<<"main ends"<<endl; return 0; } |