c++程序设计笔记(2)

对象的内存空间:
     对象的大小=所有成员变量的大小之和
     例如,一个对象中有两个int类型的变量,那么该对象的大小sizeof(thisobject)=8两个int的大小(8字节)

访问类的成员变量和成员函数:
     1、对象.成员变量/成员函数
     2、指针->成员名
          CRectangle r1,r2;
          CRectangle *p1 = &r1;
          p1->w;(注意:没有*号了)
      3、引用.成员名(等价于对象.成员名)

重载:
     相同的函数名,不同的参数列表(参数的个数,参数的类型),只有返回类型不同的不能算重载。
     在对使用了缺省参数的函数进行重载的时候要避免重载时的二义性void value(int v = 0){x=v;}和int value(){return x;}调用的时候不能确定是哪个函数

构造函数:
     1、名字与类名相同,可以有参数,但不能有返回值(void也不行)
     2、作用是对对象进行初始化
     3、定义类时没有写构造函数,会调用默认的构造函数,但默认的构造函数不做任何操作。
     4、对象生成时构造函数被自动调用,一旦对象生成完毕就再也不能在其上执行构造函数。
     构造函数在数组中的使用:
          CSample array2[2]={4,5}调用带参数的构造函数,且第一个构造函数的参数为4,第二个构造函数的参数为5
class A{
    int n;
    int m;
public:
    A(){}
    A(int a){
        = a;
        cout<<"func 1"<<endl;
    }
    A(int a,int b){
        = a;
        = b;
        cout<<"func 2"<<endl;
    }
};
a[ 2]={ 1,A( 1, 2)};
A * p[ 2] = { new A( 1), new A( 1, 2)};
          A * p[2]是一个指针数组,不是一个对象数组,在没有new之前是不会调用构造函数的

初始化列表:
     初始化的一种方式,不用=赋值,而是A(int a,int b):n(a),m(b){},用括号中的值为变量进行初始化

复制构造函数:
     1、只有一个参数,即同类对象的引用
     2、X::X(X&) 或 X::X(const X &),后者只能以常量对象作为参数
     复制构造函数起作用的三种情况:
     1、当用一个对象去初始化同类的另一个对象时
A b(1,2);
A c = b;此处是初始化(调用的是复制构造函数)
          
A b(1,2);
A c ;
c = b;此处是赋值(调用的是操作符的重载)
       2、如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用。
class  A{
public:
    A(){}
    A( & a){
        cout << "copy constructor" <<endl;
    }
};
void func( a1){}
int main() {
    a2;
    func(a2);
    return  0;
}
          由于复制构造函数是自己指定的,因此形参a1的值不一定等于实参a2的值,默认的复制构造函数是会执行复制的工作的。
        3、如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用。
class A{
public:
    A(){}
    A(& a){
        cout<<"copy constructor"<<endl;
    }
};
func(){
    b;
    return b;
}
int main() {
    func();
    return 0;
}
          不同的编译器会有优化措施,导致没有输出结果,visual stdio可以

类型转换构造函数:
     目的:实现类型的自动转换
     形式:
          1、只有一个参数
          2、不是复制构造函数
class A{
public:
    double real,image;
    A(){}
    A(int i){
        cout<<"int constructor"<<endl;
        real = i;
        image 0;
    }
};
int main() {
    a1;
    a2 = 12;//调用类型转换构造函数但没有临时对象生成
    a1 = 9;//调用类型转化构造函数,9被自动转换成临时A对象
    return 0;
}
          不同的编译器对类型转换构造函数会有优化措施,g++下初始化处编译不通过,赋值可以正常输出,visual stdio都正常输出

析构函数:
     作用:对象消亡前的善后工作(释放分配空间),自动被调用。定义类时没写析构函数编译器生成缺省析构函数,但缺省的析构函数不做任何事情。
     1、成员函数的一种
     2、名字与类名相同
     3、名字前有’~’
     4、没有参数和返回值(构造函数有参数但没有返回值)
     5、一个类最多只有一个析构函数
class A{
public:
    double real,image;
    A(){}
    A(& a){
        cout<<"copy constructor"<<endl;
    }
    A(int i){
        cout<<"int constructor"<<endl;
        real = i;
        image 0;
    }
    ~A(){
        cout<<"destructor"<<endl;
    }
};
int main() {
    a1;
    a1 = 9;
    return 0;
}
          输出结果:int constructor
destructor
destructor
          a1 = 9时会生成一个临时的对象,该对象赋值完后消亡。第二次消亡发生在return时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值