c++ 动态对象的创建,静态成员变量 静态成员函数 const成员变量 const成员函数 友元类 友元函数 和运算符重载

一、动态创建对象

1.普通定义对象:    class student {};    student danny(1,2)

2.动态创建对象:   new的方式创建对象

                     第一种:缺省构造class student {};  student*  pdanny = new student;

                     第二种:有参构造 class student {  public: student(int a,double b){} };

                                      student*  pdanny = new student(1,1.0);

                                      Pdanny->id = 123;

                     第三种: 创建数组 student*  pdanny = new student[2];

3.注意:

      动态创建的对象,一定要用delete释放,否则内存泄漏

      对象和简单的数据类型没有区别,但new对象会调用构造,delete调用析构

                        

二.类的静态成员和const成员

1.静态成员变量

  定义:静态成员变量属于整个类,不属于某一个对象。

  格式: 在变量前加static 。 例如  static  int m_age ;

  初始化:必须在类外初始化   (int box::boxNum = 5;)不可以在.h文件中初始化

  使用: 第一种:通过对象.变量 的方式访问   danny.num = 10;

          第二种: 通过类名冒号的方式访问:  student::num = 10;

注意: 静态成员变量属于类,不属于某个对象,但可以用对象去访问

         只要一个对象修改了静态成员变量的值,所有对象都发生改变

         静态变量只有一份内存;不是每个对象多有内存;

静态成员变量不占用类的空间大小,所以sizeof(类名)中的大小是1

必须在类外初始化,不可以直接在静态成员变量后加等于号 ;

2.静态成员函数

   定义: 静态成员函数也是属于类,不属于某个对象

   格式: static 返回值 函数名(参数){}       static加在函数最前面

   注意: 实现和定义分离时候,实现不可以加static关键字

          静态成员函数只可以使用静态成员变量;

          静态成员函数中,不会自动添加this,但static属于类不需要this可以访问到;

          静态成员函数可以通过对象.访问访问,也可以通过类名冒号方式访问;

          静态成员函数只可以访问静态成员变量,不可以访问非静态成员变量

          用来判断对象是否创建,用于单例模式(只可以创建一个对象)

3.const成员变量

   定义:被const修饰的成员变量,不可以修改。

   初始化:const成员变量必须初始化,在类内初始化,可以在声明的时候直接赋值。

         第一种方式: 直接在定义成员变量时候进行初始化

                       const int m_age = 0;

         第二种方式: 构造函数的初始化列表中,但不可以在构造的大括号中

                    stduent::stduent(int age  ,int id):m_id(id),m_age(age){}

注意:需要添加c++标准  g++ 02main.cpp  02const.cpp   -std=c++11

4.const成员函数

   定义:const关键字写在函数参数列表后,声明和实现都必须加const

   作用: const成员函数不可以修改成员变量的值

   格式: void stduent::show(int a,int b)const { } 函数最后添加const

   注意事项:

          Const成员函数和非const成员函数构成重载

          非const函数可以调用const成员函数,const成员函数不可以调用非const函数

          非const对象(指针)优先调用非const成员函数,没有非const则调用const函数

          Const对象优先调用const成员函数。不可以调用非const成员函数

     const成员变量: 在定义类的时候,成员变量前加const ;const int m_age = 10;

     Const成员函数:定义类时,在函数后加const; void fun()const;

     Const对象: 在定义对象时,在前面加const, const student danny;

三、友元

1.友元函数

   定义在类外,但可以访问类中的所有成员变量(包括私有,共有和保护)

   注意:尽管友元函数在类中声明,但不属于类,也就不属于对象,也不是成员函数

             友元函数可以理解成全局函数,可以通过对象访问私有成员

             友元函数没有this指针,因为不属于类。

             友元函数中定义的局部变量,不可以在类中的成员变量中使用。

             友元函数只可以在类中声明,不可以在类外。

             友元函数可以在类外实现,不需要加类限定符。

   格式: 在类中,函数名前加friend ,但需要传入当前类的对象才能操作成员变量;

 

2.友元类

        定义: 定义一个类是其他类的友元,则友元类可以访问原类的所有成员和方法

        例如: class a{int x; int  y; int z; friend class b; };   class b{int danny; int age;};

        注意: 在b类中访问a类的成员变量,需要用对象的方式

                   b是a的友元则a不是b的友元,说明b可以访问a的私有成员和方法

                   b中可以使用a的友元函数;因为友元时全局函数;

        

四.运算符重载

1.函数重载:在同一个作用域内,函数名相同参数列表不同的多个函数

2.运算符重载: 也是重载,和函数重载相类似,但运算符前需要加operator;

例如: 如下代码Student a  ;student b;   if(a > b){} 有错误,编译器不知道怎么比较

3.运算符汇总:

   算数运算符: +  -  *  /  %

   关系运算符: > <  >=   <=  ==  !=

   逻辑运算符: &&   ||  !

   二进制运算符:    &   |   ~   >>   <<   ^

   赋值运算符:  +=  , >>=  , =

   三目运算符:  ?:

   自增减运算符:  ++   --

   内存申请:  new   delete

   特殊运算符:  ()       .     ->   ,  [ ]       #

   大小运算符: sizeof()

   流运算符 : >>    <<   

不可以重载运算符: 三目运算符(?:)

                   点运算符(danny.x)

                   作用域运算符(student::fun())

                   计算大小运算符(sizeof())

                   #号运算符   

                    ->*     .*

4.格式: int operator+(对象的引用) ;    

  注意: 运算符重载中,原本的属性不可以改变,(单目,结合方式)  

         大部分的运算符重载都有三种方式,全局函数,友元函数,成员函数实现

猜你喜欢

转载自blog.csdn.net/m0_74889801/article/details/128621335