关闭

C++学习笔记(二)

标签: c++构造函数析构函数this指针常对象
867人阅读 评论(0) 收藏 举报
分类:

1.1构造函数

class Time
{
      public:
           Time();      //无参构造函数声明
           Time(int a,int b);  //有参构造函数声明
}

(1).构造函数在建立对象时自动执行,且只执行一次。

(2).名字与类名相同。

(3).不具有任何类型,不具有返回值。void Time();  是错误的。

(4).构造函数不被对象调用。t1.Time();是错误的。

(5).如果用户没有定义构造函数,系统会自动生成一个构造函数,但函数体是空的,没有参数,不执行任何初始化操作。

1.2析构函数

class Time
{
      public:
           Time();      //无参构造函数声明
           Time(int a,int b);  //有参构造函数声明
           ……
           ~Time();    //析构函数声明
}

(1).~是取反运算符。

(2)析构函数是在撤销对象占用的内存之前完成一些清理工作;static局部对象:在main函数结束或调用exit函数结束程序时,调用static局部对象的析构函数;全局对象:

在main函数结束或调用exit函数结束程序时,调用该全局对象的析构函数;new动态建对象:delete运算符释放该对象时,先调用析构函数。

(3).构造函数可有多个,但析构函数只有一个。

(4).构造函数和析构函数的顺序是栈顺序。

 1.3对象数组

Student(int = 1001,int = 18,int  = 60);    //构造函数声明

Student stud[3] = {60, 70,  78};   //定义对象数组

这三个实参分别作为3个对象的实参。所以,在定义数组提供的实参个数不能超过数组元素个数。

1.4对象指针

(1).对象空间的起始地址就是对象的指针。

(2).

class Time
{
  public:
     Time(int ,int ,int); // 构造函数声明
      int  hour;
      int  minute;
      int    sec;
      void    get_time();   
};
Time t1(10,36,6);

int *p1 = &t1.hour;    //定义指向整形数据的指针变量p1,并使p1指向t1.hour。

Time  *p2  =  &t1;   // 定义指向Time类对象的指针变量p2,并使p2指向p1;

void (Time ::  *p3) ();    //定义指向Time类共用成员函数的指针变量p3

1.5this指针

this指针是指向本类对象的指针,他的值是当前被调用的成员函数或数据成员所在的对象的起始地址。this指针是隐式使用的,他是作为参数被传递给成员函数的。

例:

int  Box ::volume()                                                            int    Box ::volume()

{                                                                                          {

    return  (height*width*length);    -------------->               return  ( this->height*this->width*this->length);

}                                                                                          }

1.6共用数据的保护

1.6.1常对象

类名  const 对象名【(实参列表)】     或     const   类名  对象名【(实参列表)】

Time  const  ti(7 , 8 , 9);

常对象不能调用该对象的非const型成员函数。

1.6.2对象成员

1.6.2.1常数据成员

const  数据类型  变量名;

const  int  count;

常数据成员只能通过构造函数初始化参数列表,之后不能被再次赋值。

mutable  int  count;把jcount常数据成员声明为可变数据成员,可修改其值 。

1.6.2.2常成员函数

类型名  函数名()   const;

void  get_time ()  const;   //const在()后面

数据成员 非const成员函数 const成员函数
非const的数据成员 可引用,可改变其值 可引用,不可改变其值
const数据成员 可引用,不可改变其值 可引用,不可改变其值
const对象的数据成员 不允许引用和改变其值 可引用,不可改变其值

1.6.2.3指向对象的常指针

类名  * const 指针变量名 = 对象地址;

指针变量声明为const,指针始终保持其值,不改变。

1.6.2.4指向常对象的指针变量

const  类型名  * 指针变量名;

(1).变量被声明常变量,只能用于指向常变量的指针变量

(2).指向常变量的指针变量也可指向非const变量,此时不能改变指针变量的值。

(3).函数的形参指向非const形变量,实参只能用指向非const变量的指针。

1.7静态成员

在类内声明:

static  类型  变量名;

类外定义:

 数据类型  类名::静态数据成员 = 初值; 

例:

class Box

{

     private :

        static int height;

} ;                                                                                                                                                                                                                                                                                                                int  Box::height = 10;

(1).静态数据成员在内存中只占一份空间,属于这个类的这个类的对象共享静态数据成员的值,但值对所有对象都一样。

(2).静态数据成员不属于对象,对象所分配的空间不包括静态数据成员所占的空间。

(3).静态数据成员的初始化只能在类体外进行初始化。

(4).静态数据成员既可以通过对象名引用,也可通过类名来引用。

(5).静态成员函数跟静态数据成员一样,静态数据成员不能访问本类中的非静态成员。

(6).静态成员函数和静态数据成员先于对象存在。

1.8友元

友元函数不被类所有。

#include <iostream>

using namespace std;

class Time;
class Date
{
private:
    int year;
    int month;
    int day;
public:
    Date() { }
    Date(int ,int ,int);
    void disPlay(Time &);
};     //定义一个Date类,成员函数display,形参是Time类对象

class Time
{
private :
        int hour;
        int minute;
        int second;
public:
    friend void disPlay(Time &);   //disPlay函数为Time的友元函数
    friend void Date::disPlay(Time &);   //声明Time类中的disPlay函数为本类的友元函数
    Time(int ,int ,int );
    Time(){ }

};
Time::Time(int hour,int minute,int second)   //Time类的构造函数
{
        this->hour = hour;
        this->minute = minute;
        this->second = second;
}
Date::Date(int year,int month,int day)   //Date类的构造函数
{
    this->year = year;
    this->month = month;
    this->day = day;
}

void disPlay(Time &t)    //disPlay构造函数的定义
{
    cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}

void Date::disPlay(Time &t)    //定义Date类的disPlay方法
{
    cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
    cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}

int main()
{

    Time time(1,2,3);
    Date date(1993,8,7);
    disPlay(time);   //调用
    date.disPlay(time);
    return 0;
}

                                                                                                   

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:85886次
    • 积分:1672
    • 等级:
    • 排名:千里之外
    • 原创:77篇
    • 转载:6篇
    • 译文:1篇
    • 评论:10条