C++——类的基础知识(类定义、结构体、面向对象特点、类的大小、带默认值的函数、内联函数inline、常成员函数)

C++——类的基础知识(类定义、结构体、面向对象特点、类的大小、带默认值的函数、内联函数inline、常成员函数),第1张

目录

 一、类

 二、struct 和class 的区别 

三、面向对象的特点(重点)

 四、类的大小

五、this指针

六、带默认值的函数

 七、内联函数:(inline)(重点)

 八、常成员函数

 一、类

(1)定义:将不同类型的数据以及这些数据相关的操作封装在一起。
(2)类=属性+函数         (操作属性)
  (3)访问权限——public(共有的)、protected(保护的)、private(私有的)
ps:在学习继承之前,protected不用,只用public和private

//定义一个类
class Clock
{
//公有的
public:
	void Set() 
	{
		m_hour = 20;
		m_minute = 10;
		m_second = 20;
	}//设置时间

	void Show()
	{
		cout << m_hour << ":" << m_minute << ":" << m_second<
 二、struct 和class 的区别 

(1)结构体struct的默认权限是——public;
(2)类class的默认权限是——private。

测试代码: 

//结构体
struct AA
{
	void print()
	{
		cout << "AA:print" << endl;
	}
};

//类
class BB
{
	void print(){}
};

void main()
{
	AA a;
	BB b;
	a.print();
	b.print();//私有的,无法访问
}
三、面向对象的特点(重点)

(1)封装:属性(public)+操作(private)(把属性和操作放在一个集合里);
(2)继承:是一个层次关系(从上层往下层),从下层往上层(派生);
(3)多态:多种状态(4种)
                 ①重载多态——函数重载(函数名相同,函数参数列表不同,与返回值无关)
                                   ——运算符重载;
                 ②强制多态——强制类型转换:static_cast,dynamic_cast,cosnt_cast...
                 ③包含多态——虚函数的多态 virtual;
                 ④参数多态——模板(模型)。
(4)抽象——有时候不被认为是一个特点,是一个过程 。

ps:(严格来说只有前三个特点) 

 四、类的大小

1.一般情况下,类的大小是属性之和,普通函数不占类空间大小;
2.静态属性static不占类内存空间大小;
3.虚函数virtual在类内存分配一个指针的大小(4个字节),无论增加多少个virtual函数,都只增加一个指针大小。
 ps:(虚表中只放一个指针)

 测试代码:

class AA
{
public:
	void test()
	{
	}
	virtual void fn() {}
	virtual void fn1() {}
	virtual void fn2(){}

private:
	int m_i;
	char m_sex;
	int m_age;
	static int m_num;//静态属性
};

void main()
{
	cout << sizeof(AA) << endl;
}
五、this指针

(1)this——在非static成员函数中,有一个隐含的指针this,this指向当前类对象,即是接受当前类对象的地址;
(2)this是指针,只能指向->

   void Set()
	{
		m_hour = 10;
		m_minute = 20;
		m_second = 30;
	}
	void Set(int h)//c1.Set(12)
	{
		//this=&当前对象 (的地址)
		this->m_hour = h;
		this->m_minute = 10;
		this->m_second = 30;
	}//设置时间  h:10:30
	void Set(int h, int m)
	{
		m_hour = h;
		m_minute = m;
		m_second = 30;
	}
	void Set(int h, int m,int s)
	{
		m_hour = h;
		m_minute = m;
		m_second = s;
	}


	void Show();
	{
		cout << this->m_hour << ":" << m_minute << ":" << m_second << endl;
	} 
	
六、带默认值的函数

注意:
1.一般情况下,尽量把参数都带上默认值;如果有不带默认值的,一定在前面,即是有一个参数带默认值了,它后面的参数必须带默认值;

2.在声明的时候带默认值,如果放在类外定义次函数,则默认值不需要再定义 。

class Clock
{
public:
	//带默认值(缺省值)的函数
	void Set(int h = 12,int m = 30,int s=30)
	{
		m_hour = h;
		m_minute = m;
		m_second = s;
	}

private:
	int m_hour;//m_(下划线)表示成员的意思
	int m_minute;
	int m_second;
};

void Clock::Show()//把当前函数放在类外面定义,结果一样
{
	cout << this->m_hour << ":" << m_minute << ":" << m_second << endl;
}
void Set(int h, int m, int s, int f)
{

}

void main()
{
	Clock c,c1, c2, c3;
	c.Show();
	c1.Show();
	c2.Show();
	c3.Show();
}
 七、内联函数:(inline)(重点)

1.函数调用——时间消耗,空间消耗
2.内联函数——代码比较短小,功能比较简单的一些函数,放在类里面直接定义,
          这些函数可以作为内联,在函数调用时直接将函数体嵌入到当前调用处,直接执行,不会有函数调用的转移
例:简单地赋值,输出,返回函数。
3.分类:隐式内联、显式内联inline
4.用空间的消耗换取了时间的消耗
5.内联函数和宏定义的区别:
(1)内联函数是——函数,宏定义是——预处理命令
(2)内联是在运行时执行,宏是编译之前执行
(3)内联不会出现歧义,宏会出现歧义

#define N 3k//本身这个宏定义没有错,

#define S(a,b)(a+b)//写的时候把括号加到不能加为止(用的时候原模原样去替换,不要加括号)

#define S(a,b)((a)*(b))
void main()
{
	cout << S(3, 4) / S(3, 4) << endl;//3+4/3+4=8;S(a,b) a+b 加上括号后结果为1
	cout << S(3 + 3, 4 + 4) << endl;//(用的时候原模原样去替换,不要加括号)
}

内联函数测试代码: 

class A
{
public:
	inline void fn(int i = 0, int j = 0, int k = 0);
	/* {
		m_i= i;
		m_j = j;
		m_k = k;
	}
	*/
	void Print()
	{
		cout << m_i<<" "<< m_j<<" " << m_k<< endl;//隐式内联
	}
	inline void Sort()//这个不会按照inline来编译
	{
		//.....
	}
private:
	int m_i;
	int m_j;
	int m_k;
};

void A::fn(int i = 0, int j = 0, int k = 0)
{
	m_i = i;
	m_j = j;
	m_k = k;
}

int main()
{
	A a, b, c, d;
	a.fn();
	b.fn(1);
	c.fn(1, 2);
	d.fn(1, 2, 3);
	a.Print();
	b.Print();
	c.Print();
	d.Print();
	a.Sort();

}
 八、常成员函数
class A
{
public:
	void Set(int i = 0,int j = 0)
	{
		m_i = i;
		m_j = j;
	}

	int GetI()const//在函数后面加const,是常成员函数——不能修改本类数据成员的值,不能修改m_i和m_j
	{
		cout << "geti cosnt" << endl;
		return m_i;
	}

	int GetI()//非const对象调用
	{
		cout << "get i" << endl;
		return m_i;
	}

	/*
	* 情况一:
	int GetJ()
	{
	    return m_j;
	}
	情况二:
	int& GetJ()//返回m_j的引用
	{
		return m_j;
	}
	情况三:
	*/
	const int& GetJ()//返回m_j的引用
	{
		return m_j;
	}
	void Print()
	{
		cout << m_i << m_j << endl;
	}

private:
	int m_i;
	int m_j;
};
int main()
{ 
	A b;
	//const A b;
	b.GetI();//常成员函数GetI
	A a;
	a.Set(10, 20);
	//cout << a.m_i << endl;
	cout << a.GetI() << endl;
	//a.m_j=40;//error
	//a.GetJ() = 40;//值返回不能放在左边
	//a.GetJ() = 40;
	a.Print();
	cout << a.GetJ() << endl;
}

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/langs/3002959.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-09-27
下一篇2022-09-27

随机推荐

  • 网络用语违和感是什么意思

    违和感,就是指一个事物与另一件有关联的事物或周围的环境比较后所产生的不适应、不协调,而感到无法融入其中,产生一种疏离感的意思。简单说来就是“合不来、不相容、不协调的感觉,不和谐的感觉”。常用作“毫无违

    2022-12-06
    000
  • 网络语黄焖鸡是什么意思骂人的

    黄焖鸡,形容一个人又黄又闷又垃圾。同肥宅。微辣黄焖鸡,完整句是:“渣男会呼吸,渣女蹦野迪,绿茶交际花,微辣黄焖鸡,直男爱萝莉,直女恋腹肌,而我不一样,深情又专一。”这是在抖音上很流行的句子,很押韵哦。

    2022-12-06
    000
  • 网络用语gn是什么意思

    gn,其实就是晚安的意思,晚安的英文是good night,Gn8也是晚安的英文缩写,也是老外常用的英文缩写形式。gn=gn8=gnight=good night=晚安说明:一般第一个人常说gnigh

  • 奶茶女孩是什么意思

    奶茶女孩,在爱情里像奶茶一样一直都是甜甜的的女孩,就是那种可可爱爱,温柔体贴,善解人意,表里如一,软软糯糯的女孩子。和奶茶女孩谈恋爱就像喝奶茶一样,让人总是感觉特别美好,甜蜜如初。与咸鸭蛋女孩截然相反

    2022-12-06
    000
  • 明末清初三大思想家是谁

    明末清初三大思想家是分别是王夫之、顾炎武和黄宗羲。1、王夫之(1619-1692),字而农,号姜斋,湖南衡阳人;晚年隐居衡阳的石船山麓,世称船山先生。明亡,他在衡阳起兵抗清,败后退至广东肇庆,在南明桂

    2022-12-06
    000
  • 卫子夫是皇后吗

     历史上的卫子夫是皇后,她是汉武帝刘彻的第二任皇后,原本是平阳公主家的歌女,之后被刘彻宠幸带进宫中,因为生下了皇长子被册封为皇后,让原本是奴隶的卫家,成为了长安城中的贵族。卫子夫的出身非常的卑微,因为

    2022-12-06
    000
  • 汉朝的最后一个皇帝是谁

     汉献帝刘协是东汉的最後一任皇帝。 汉献帝刘协,字伯和,是汉灵帝刘宏的次子,汉少帝刘辩的异母弟弟。刘协的母亲是灵怀皇后王荣,这个女子是前五官中郎将王苞的孙女、王章之女。作为一个出身名门世家的大家闺秀,

    2022-12-06
    000
  • 西施为什么叫沉鱼

    西施被叫做沉鱼是源于&ldquo;西施浣纱&rdquo;的经典传说,当时西施在溪边浣纱,清彻的河水映照她的身影,显得更加美丽,鱼儿看见她的倒影,忘记了游水,渐渐地沉到河底。西施是中国古代四大美女之一,

    2022-12-06
    000
  • 清朝的辫子有什么意义

    清朝男性的发型是遵照满人的习惯而来的,表示满州人入主中原后,各族人对满人的臣服。这种发型不能简单的叫做留辫子,而是剃掉前面的头发,将后面的头发打成辫子。满族人的先祖发源于白山黑水,以打猎捕鱼为生,前头

发表评论

登录后才能评论

评论列表(0条)

    保存