美文网首页
<C++程序设计>指针,引用,构造和虚构函数,复制构

<C++程序设计>指针,引用,构造和虚构函数,复制构

作者: zhouluyao | 来源:发表于2017-12-23 22:16 被阅读10次

    指针

    pta = &a 通过pta可以找到a的地址

    我们将存放地址的变量称之为指针变量,这里的地址就是指针,指针也是数据类型 *是指针类型变量的标志符号

    定义一个指针变量系统为该指针分配一定大小的内存,在C++中,每个指针变量的大小为8字节

    int a,*pta;//先定义变量 pta = &a;

    pta = &a; 不可写成 *pta = &a;

    *pta并不表示指针变量pta,而表示pta指向的变量a,指针变量与指针变量所指向的变量是完全不同的概念

    &变量名 //获取变量的内存地址

    char name[50];

    name是字符数组,name的首地址也就是&name[0]

    char str[81],*pstr;

    str ="abcd";数组名是常量指针,不能被赋值

    Template <calss T> class指某种类型(char ,int ,struct)

    指针:指向变量的地址

    程序运行时,函数会占有连续的内存空间,函数名就是内存空间的起始地址

    int &r = n; //r引用了n,r的类型就是int &,某个变量的引用相当于这个变量的别名

    int &r=n; //r引用了n,n就是r,r就是n

    引用的概念:

    1.一定要初始化成引用某个变量

    2.初始化后它就一直引用该变量,不再引用别的变量(从一而终)

    3.引用只能引用变量不能引用常量和表达式

    int n1,n2;
    
    swap(n1,n2);
    
    Void swap(int &a,int &b){
    
    Int tmp;
    
    tmp =a;
    
    a=b;
    
    b=tmp;
    
    }
    

    常引用,定义引用时,前面加const关键字,即为“常引用”

    const int &r = n; //r的类型是const int &,不能通过常引用去修改其引用的内容

    Const int &r =n; r=200;//编译错

    对象的大小 = 所有成员变量的大小之和

    CRetangle r1,r2;

    用法1:对象名.成员名 r1.w =5;

    用法2:指针->成员名 CRetangle *p1 =&r1; //定义指针p1指向对象r1的首地址 p1->w =5;

    用法3:引用名.成员名 CRetangle r2; CRetangle &rr =r2; rr.w =5;

    类就是自己定义的数据类型

    new出来对象的返回值是指针(*)

    CSample *array = new CSample[2];

    delete []array;//动态创建的对象要用delete删除

    有*说明是指针数组,不是对象数组

    Test *pArray[3];//不会导致对象的生成,是一个指针就不是对象,不会引发对象的生成

    对operator = 返回值类型的讨论,void好不好?

    考虑a =b =c; 等价于 a.operator = (b.operator= (c));

    只有返回一个引用时,才可以作为下一个函数作用的对象

    一个函数的返回值如果它不是引用的话,我们是不能把函数的返回值写在“=”左边的

    构造和虚构函数

    构造函数:名字和类名相同,可以有参数,不能有返回值

    对象占用的存储空间是不是构造函数分配的?构造函数是在对象已经占用的存储空间做一些初始化的工作,如果把对象比作房子,构造函数不是盖房子只是进行装修

    定义时没写构造函数,编译器会默认生成一个无参的构造函数

    为什么需要构造函数?

    1.执行必要的初始化工作

    2.程序没有初始化就使用会导致报错

    new出来对象的返回值是指针(*)

    CSample *array = new CSample[2];

    delete []array;//动态创建的对象要用delete删除

    有*说明是指针数组,不是对象数组

    Test *pArray[3];//不会导致对象的生成,是一个指针就不是对象,不会引发对象的生成

    类就是自己定义的数据类型

    复制构造函数

    为string编写复制构造函数的原因,防止调用默认构造函数浅copy导致内存空间被多次释放的问题
    String::string(String &s){
    
    if(s.str)
    
    {
    
    str = new char[strlen(s.str) +1];
    
    strcpy(str,s.str);
    
    }
    
    }
    
    
    
    CArray a;
    
    for(int i=0;i<5;i++)
    
    a.push_back(i);
    
    a[3] = 100;
    
    CFArray a4(a);//a4是用复制构造函数初始化的,a4是a的复制品,a4和a的内容存储在不同的内存空间
    

    派生类对象的体积 = 基类对象的体积 +派生类对象自己的成员变量的体积 ,派生类对象包含着基类对象,积累对象存储的位置位于派生类对象新增的成员变量之前

    class cDog;
    
    Class cMaster {
    
    cDog dogs[10];
    
    }
    
    Class cDog{
    
    cMaster m;
    
    }
    
    循环定义计算不出体积大小,为了避免循环定义,为“业主”类设置一个“狗”类的对象指针数组
    
    class cMaster{
    
    cDog *dogs[10];//10个元素的指针数组,每个元素都是一个指针,字节数就是40个字节
    
    }
    

    相关文章

      网友评论

          本文标题:<C++程序设计>指针,引用,构造和虚构函数,复制构

          本文链接:https://www.haomeiwen.com/subject/sgfcgxtx.html