c++类和对象(上篇)

一、概念

c++是面向对象的编程语言,面相对象的意思就是在解决问题的过程中,注重在解决问题的过程中把事情拆分成不同的对象,通过对象之间的交互完成的

二、类

c++中的类是指class,struct在c++中也升级成了类
在类中可以有成员变量,成员函数,通过访问限定符保护成员变量
image.png

int main()
{
	class MyClass//定义一个类,类名为MyClsaa
	{
		public://公有访问限定符后面的的属于公用,直到遇到下一个访问限定符
			MyClass()//初始化语句
			{
				i = 10;
				c = 'm';
			}
			void print()//成员函数
			{
				cout << i << endl << c << endl;
			}

		private://后面属于私有,无法通过创建的对象直接访问
			int i;
			char c;
	};
	MyClass c;//创建实例化对象c
	c.print();//调用成员函数
	return 0;
}

1.构建函数与析构函数

关于实例化对象的初始化,c++会在创建实例化对象的时候自动调用构建函数(初始化对象函数),
这个构建函数要求无返回值,且名字要和类名一致。如果用户没有定义这个函数则会自动生成一个构建函数(自动生成的构建函数不会初始化自带类型变量,会初始化自定义类型)

class MyClass//
	{
		public:
			MyClass()
			{
			}
			void print()
			{
				cout << i << endl << c << endl;
			}

		private:
			int i=10;//可以在声明的时候给缺省值
			char c=‘m‘;
	};

你也可以创建构建函数的重载函数

class MyClass//
	{
		public:
			MyClass()
			{
                i=10;
                c='m';
			}
			MyClass(int _i,char _c)//与上面的构成重载函数
			{
                i=_i;
                c=_c;
			}
			void print()
			{
				cout << i << endl << c << endl;
			}

		private:
			int i;
			char c;
	};
int main()
{
    MyClsaa ca(10,'k');//传值初始化
}

析构函数,就是释放对象变量课件的函数,当对象生命周期结束的时候,c++会自动调用,当用户没有定义这个函数的时候会自动生成,析构函数的函数名在类名之前加一个~,要求无返回值

2.类的空间占用

类的空间计算方法与结构体类似,其中的成员函数存储在栈区,不存储在对象中

3.类中的this指针

class MyClass//
	{
		public:
			MyClass()
			{
                i=10;
                c='m';
			}
			MyClass(int _i,char _c)//与上面的构成重载函数
			{
                i=_i;
                c=_c;
			}
			void print()
			{
				cout << i << endl << c << endl;
			}

		private:
			int i;
			char c;
	};
int main()
{ 
    MyCalss mc(10,'k');
    mc.printf();
}

我们在调用mc.print的时候为什么能够准确的打印出10和k,c++给每个非静态的成员函数引入一个this执政,让成员函数指向该对象,ptint中访问i和c的操作都是通过this指针实现的

void print(MyClass*this)
{
    cout << this->i << endl << this->c << endl;
}

在编译器眼中这段代码的样子

class MyClass//
{
    public:
        void print()
        {
            cout <<"print"<< endl;
        }

    private:
        int i;
        char c;
};
int main()
{
    Myclass*p=nullptr;
    p.print;
}

以上代码运行不会出问题,因为,成员函数不是存储在对象中,print函数也没有对this函数解引用,所以不会报错

class MyClass//
{
    public:
        void print()
        {
            cout <<i<< endl;
        }

    private:
        int i;
        char c;
};
int main()
{
    Myclass*p=nullptr;
    p.print;
}

而这段代码在运行的时候会奔溃,因为print函数对空指针进行了解引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值