咸鱼的翻身计划6:c++中的类和对象,对象特性

本文详细介绍了C++中的构造函数初始化列表、静态成员(变量与函数)的特性及使用,以及this指针的作用。通过示例代码解释了如何初始化对象、共享数据以及在类成员函数中区分同名变量。同时,文章讨论了空指针调用成员函数的场景,并探讨了const修饰成员函数及其对常对象的影响。
摘要由CSDN通过智能技术生成

1.初始化列表

C++除了可以用构造函数初始化,还有一种方法,就是初始化列表,

语法:构造函数():属性1(值1),属性(值2)…{ }

感觉算是构造函数的一种延伸用法。

2.静态成员

就是在成员变量和成员函数前加上关键字 static ,对应的成员就称之为静态成员。

静态成员变量:

(1)所有对象共享同一份数据,比如实例化s1,s2,如果s1的静态变量值改变,s2的也会改变。

(2)类内声明,类外定义,必须得有一个初始值,否则没法用,而且不能在类内定义。

(3)在编译阶段分配内存

#include<iostream>
using namespace std;


calss Student{
public:
    

    int m_Age;    //普通成员变量
    
    static int m_Height;    //静态成员变量,类内声明

    

};

int Student::m_Heiight = 100;    //类外初始化,Student:: 表明是初始化Student类里面的静态变量


int main()
{
//除了常规的先创建一个对象来访问成员变量外,还可以通过类名访问静态变量
    Student s1;
    s1.m_Height=200;    //常规访问

    Student::m_Height=1000;    //通过类名访问


    return 0;
}
    




静态成员函数:
(1)所有对象共享一个函数

(2)静态成员函数只能访问静态成员变量

#include<iostream>
using namespace std;


calss Student{
public:
    

    void test()
    {
        //m_Age=0;    //写这行会报错,静态成员函数只能访问静态成员变量
        
        m_Height=0;
    }

    int m_Age;    //普通成员变量
    
    static int m_Height;    //静态成员变量,类内声明

    

};

int Student::m_Heiight = 100;    //类外初始化,Student:: 表明是初始化Student类里面的静态变量


int main()
{
//静态成员函数两种访问方式,跟静态成员变量一样。
    Student s1;
    s1.test();

    Student::test();

    return 0;
}
    




3.成员变量和成员函数分开存储

每个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用同一块代码。就跟全局函数差不多的性质,不过成员函数只有类创建的对象可以用,所以说创建一个对象,只有非静态成员变量,是这个对象独有的,其他像静态成员对象,成员函数,静态成员函数,每个对象都可以共享。

4.this指针

c++提供的特殊的对象指针,也就是对象类型的指针,哪个对象被访问,this就指向哪个对象,比如你定义一个Student类,this指针就相当于Student *this 跟C中的结构体指针一个意思,然后创建一个对象 Student  s1; 如果访问s1, 则此时this就指向s1除了用 s1.成员变量用 还可以在类内用 this->成员变量 来访问对象成员。在类内使用,无需定义。(如果指针的知识不太了解可以看看这个http://t.csdn.cn/gCH6h

this作用

当形参和成员变量同名时,可以用this指针来区分。

在类的非静态成员函数中返回对象的本身,可以用return *this;

#include<iostream>
using namespace std;

class Student{
public:
    int age;    //成员变量

//this指针区分同名成员变量
    Student(int age)    //构造函数
    {
        //还像以前一样直接 age = age;是不行滴,不知道哪一个是成员变量,哪个是形参,此时用this区分
        
        this->age = age;    
    }

//this指针返回对象本身
    Student& add(Student &s)    //实现Student类的对象的age加上另一个的age。
    {
        this->age += s.age;
        return *this;    //返回这个对象,因为时返回本身,所以函数前面的返回值类型是 Studet&
    }
};


int main()
{
    //创建两个对象
    Student s1,s2;

    //初始化两个这对象
    s1.age = 10;
    s2.age = 20;

    s2.add(s1);    //此时s2的值为30;
    
//因为返回的是s2,还Student类的对象,所以可以连续调用
    s2.add(s1).add(s1).add(s1);    //这个叫链式编程思想,cout<<就是这原理。

    return 0;
}
    

5.空指针访问成员函数

比如一个函数类内定义,一般只能通过类的对象才能带调用,但你又不想再写一个一样的全局函数这时候就可以用空指针来访问,但要注意不能访问使用了this指针的成员函数,因为空指针调用的函数,this指针不指向某个对象,而是指向空,那么如果到函数访问 this->age,是不合法的。

#include<iostream>
using namespace std;

class Student{
public:
    int age;    //成员变量
    
    void add(int a,int b,int &c)    //对c,也就是第三个数输入的数进行操作,加上前两个数。
    {
        c = a+b;
        //age = c;如果加上这行再用空指针调用函数就会报错,这行代码用到了this指针,    
        //这行代码相当于是 this->age = c;
    }

};


int main()
{
    Student *p = NULL;    //定义一个类型是Student*的指针指向空,也就是不存入地址的指针变量
    int a=10,b=20,c=30;

    //空指针调用成员函数
    p->add(a,b,c);    //此时如果输出c的值应为60.
    
    return 0;
}
    

6.const修饰成员函数

const修饰的成员函数从称之为常函数,是不能修改成员属性的(也就是成员变量,都一个意思)但是可以修改前面加了mutable关键字的成员属性。

常对象,声明对象前要加上const,常对象只能调用常函数

#include<iostream>
using namespace std;

class Student{
public:
    int age;    //成员变量
    mutable int yz;
    
    void test01() const    //这就叫const修饰的常函数
    {
        yz = -100;    //修改了一下mutable修饰的成员属性
        cout<<"你是一个吃藕八怪"<<endl;
    }

    void test02()    //普通的成员函数
    {
        age = 10;    //修改了一下成员属性,如果加const修饰这个函数就是不对的
    }
};


int main()
{
    Student s1;    //创建一个普通对象

    s1.test01();    //调用常函数

    const Student s2;    //创建一个常对象

    s2.teat01();

    //s2.test02(); 这行代码是不对的,常兑现只能调用常函数   

    return 0;
}
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值