C++之类与函数

1.类的作用域:①每个类都有自己的作用域,类成员都在类的作用域内,成员函数内可任意访问成员变量和其他成员函数②对象可以通过.直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员③在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

//类体外定义成员

class Student{

    public:

            char* _name;

    public:

            void show();

}

void Student::show()

{

    cout<<_name<<endl;

}

//类内定义成员函数

class Student{

    public:

            char* _name;

    public:

            void show()

            {

                cout<<_name<<endl;

            }

}


int main()

{

    Student s1;

    s1._name="peter";

    s1.show();

    Student s2;

    s2._name="edwin";

    s2.show();

    return 0;

}

2.没有成员的类空间大小为1

        结构体内存对其规则: ①第一个成员在与结构体变量偏移量为0的地址处。②其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8    gcc中的默认值为4 ③结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。 ④如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体 的对齐数)的整数倍。

3.隐含的this指针:①每个成员都有一个指针形参②编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。③this指针是成员函数隐含指针形参,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时 显示传递对象的地址给this指针。

void display()

{

    cout<<_year<<endl;

}

void display(data*  this)

{

    cout<<this->_year<<endl;

}


4.构造函数:成员变量变成私有的,需对它们进行初始化化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时 调用的函数称为构造函数(constructor) 

   构造函数是特殊的成员函数:①函数名与类名同名②无返回值③构造函数可以重载④对象构造(对象实例化)时系统自动调用对应的构造函数⑤ 构造函数可以在类中定义,也可以在类外定义⑥如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会自动 生成缺省的构造函数⑦无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个

class Date

 {

     public : 

    // 1.无参构造函数    

         Date () 

          {

           }

     // 2.带参构造函数  

    Date (int year, int month , int day )  

   {        

          _year = year ;    _month = month ;     _day = day ;  

   } 

    private :  

       int _year ;     int _month ;     int _day ; 

};

void TestDate1 () {    

     Date d1 ;               // 调用无参构造函数  

     Date d2 (2015, 1, 1);   // 调用带参的构造函数    

     Date d3 ();        // 注意这里没有调用d3的构造函数定义出 d3

}

带缺省参数的构造函数:

class Date {

     public :     // 3.缺省参数的构造函数  

   Date (int year = 2000, int month = 1, int day = 1)   

   {      

    _year = year ;       _month = month ;      _day = day ;    

   }

     // 4.半缺省参数的构造函数(不常用)    

 Date (int year, int month = 1)  

  {    

      _year = year ;          _month = month ;          _day = 1; 

  } 

 private :    

     int _year ;     int _month ;     int _day ;

 };

void Test() {  

   Date d1 ;               // 调用缺省构造函数   

  Date d2 (2015, 1, 9);   // 调用缺省构造函数

 }

注:若缺省参数声明和定义分离,则可以在声明或定义中给默认参

5.拷贝构造函数(创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函数。):一个构造函数的重载。构造函数无this。它的参数传参必须使用引用传参,使用传值方式会引发无穷递归调用。若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依次拷贝类成员进行初始化。

class Date 

    public :    

         Date()   

         {

         }

     // 拷贝构造函数   

  Date (const Date& d)  

  {     

     _year = d ._year;  _month = d ._month;     _day = d ._day;   

 } 

    private :  

       int _year ;     int _month ;     int _day ; 

};

void TestDate1 () 

{    

 Date d1 ; // 下面两种用法都是调用拷贝构造函数,是等价的。

 Date d2 (d1);    // 调用拷贝构造函数    

 Date d3 = d1;    // 调用拷贝构造函数

 }

eg;

class date

{

    public:

        date(const date& d)

        {

            _year=d._year;

            _month=d._month;

            _day=d._day;

        }

}

        在类的成员变量中可以直接访问同类对象的私有/保护成员,C++的访问限定符是以类为单位的,也就是说在这个单位内的成员可以互相访问。

猜你喜欢

转载自blog.csdn.net/qq_40408483/article/details/79596411