【C ++基础】第四篇 类和对象(上,2024年最新大数据开发面试题2024

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

{
	return _arry[_size - 1];
}
//栈销毁
void Destroy()
{
	if (_arry)
	{
		free(_arry);
		_arry = nullptr;
		_capacity = 0;
		_size = 0;
	}
}

}Stack;


让我们看看效果



int main()
{
Stack s;
s.Init(10);
s.push(1);
s.push(2);
s.push(3);
cout << "依次将1,2,3放入栈中,目前栈顶元素是: " << s.Top() << endl;
s.Destroy();
return 0;
}


![image-20221011222534777](https://img-blog.csdnimg.cn/img_convert/65bf039a220c92edf5f63dc322e0223b.png)


【类与结构体】


1.在c语言中,struct只有属性没有方法。


而C++对struct进行了升级,可以在里面添加方法。



> 
> 当然,在C++中更喜欢用class来代替struct(两者有区别,在限定符中会讲到)。
> 
> 
> 


2.还有个小细节



//c
typedef struct List
{
List* next;//这样在c语言中是错误的
}List;
//c++
struct List
{
List* next;//c++允许这种写法,List升级为类
};


#### 3.类的定义



class className
{
//类体:由成员函数和成员变量组成

};//一定要注意后面的分号


class为定义类的关键字,className为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。


类体中内容称为类的成员:


类中的变量称为类的属性或成员变量;


类中的函数称为类的方法或者成员函数;


【类的定义方式】


类有两种定义方式:


1、声明和定义全部放在类体中。


注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。



class Student
{
public:
void showInfo()
{
cout<<_name<<endl;
}
public:
char* _name;
};


2、类声明放在.h文件中,成员函数定义在.cpp文件中。


注意:成员函数名前需要加 **类名::**


![image-20221012073411991](https://img-blog.csdnimg.cn/img_convert/dd62d98dfa2212af5d219f3628746a16.png)



> 
> 尽量使用第二种定义的方法。
> 
> 
> 


【成员变量命名规则】


像下面这样写成员变量不太合适,成员变量与函数形参重名



class Date
{
public:
void Init(int year)
{
year=year;
}
private:
int year;
};


那么我们可以加一个前缀或后缀。本人习惯用前缀。



class Date
{
public:
void Init(int year)
{
_year=year;
}
private:
int _year;
};


#### 4.类的访问限定符及封装


###### 4.1 访问限定符


C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。




#mermaid-svg-K07rOZHAZHpohrti {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K07rOZHAZHpohrti .error-icon{fill:#552222;}#mermaid-svg-K07rOZHAZHpohrti .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K07rOZHAZHpohrti .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-K07rOZHAZHpohrti .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K07rOZHAZHpohrti .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K07rOZHAZHpohrti .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K07rOZHAZHpohrti .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K07rOZHAZHpohrti .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K07rOZHAZHpohrti .marker.cross{stroke:#333333;}#mermaid-svg-K07rOZHAZHpohrti svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K07rOZHAZHpohrti .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K07rOZHAZHpohrti .cluster-label text{fill:#333;}#mermaid-svg-K07rOZHAZHpohrti .cluster-label span{color:#333;}#mermaid-svg-K07rOZHAZHpohrti .label text,#mermaid-svg-K07rOZHAZHpohrti span{fill:#333;color:#333;}#mermaid-svg-K07rOZHAZHpohrti .node rect,#mermaid-svg-K07rOZHAZHpohrti .node circle,#mermaid-svg-K07rOZHAZHpohrti .node ellipse,#mermaid-svg-K07rOZHAZHpohrti .node polygon,#mermaid-svg-K07rOZHAZHpohrti .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K07rOZHAZHpohrti .node .label{text-align:center;}#mermaid-svg-K07rOZHAZHpohrti .node.clickable{cursor:pointer;}#mermaid-svg-K07rOZHAZHpohrti .arrowheadPath{fill:#333333;}#mermaid-svg-K07rOZHAZHpohrti .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-K07rOZHAZHpohrti .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-K07rOZHAZHpohrti .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-K07rOZHAZHpohrti .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-K07rOZHAZHpohrti .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-K07rOZHAZHpohrti .cluster text{fill:#333;}#mermaid-svg-K07rOZHAZHpohrti .cluster span{color:#333;}#mermaid-svg-K07rOZHAZHpohrti div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-K07rOZHAZHpohrti :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}




































































 访问限定符 
 










 public:公有 
 










 protected:保护 
 










 private:私有 
 









【访问限定符说明】


1.public修饰的成员在类外可以直接被访问。


2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)。


3.访问权限**作用域从该访问符限定符出现的位置开始直到下一个访问限定符出现时为止**。


4.如果后面没有访问限定符,作用域就到}即类结束.


5.class的默认访问权限为private,struct为public(因为struct要兼容C)



> 
> 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
> 
> 
> 


【面试题】


问题:C++中struct和class的区别是什么?


(目前知识储备不足,搬运一下)


[(33条消息) 【C++】struct和class的区别\_忽晴忽雨江湖的博客-CSDN博客\_struct和class的区别]( )


###### 4.2 封装


面向对象的三大特性:封装、继承、多态。


封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。


封装本质上是一种管理,让用户更方便使用类。


在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外直接被使用。


#### 5.类的作用域


类定义一个新的作用域,类的所有成员都在类的作用域中。



> 
> **在类体外定义成员时,需要使用:: 作用域操作符指明成员属于那个类域。**
> 
> 
> 



class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};

//这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout<<_name<<" “<<_gender<<” "<<_age<<endl;
}


下面的代码可以吗?



Person::_age=1;
Person::PrintPersonInfo();


Person::\_age=1;不可以,是因为不能访问声明


Person::PrintPersonInfo();//不行,是因为有this指针。


#### 6.类的实例化


用**类**类型创建对象的过程,称为类的实例化。


1.**类是对对象进行描述的**,是一个模型一样的东西,限定了类有哪些成员,定义出一个类**并没有分配实际的内存空间**来存储它;


比如:入学时填写的同学的学习信息表,表格就可以看成一个类,来描述具体学生信息。


2.一个类可以实例化多个对象,**实例化出的对象,占用实际的物理空间,存储类成员变量**。



//类Person代码在上面
int main()
{
Person._age=10; //编译失败
return 0;
}


Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。


3.做个比方,类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图。


设计图只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。


![在这里插入图片描述](https://img-blog.csdnimg.cn/43959f18b512407bab3f09de07833bf2.png)


![image-20221013084408777](https://img-blog.csdnimg.cn/img_convert/979e00ed6504f8680049fcec8e010805.png)


#### 7.类对象模型


###### 7.1 如何计算类对象的大小



class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
char _a;
};


问题:类中既可以有成员变量,又可以有成员函数,那么一个类中的对象中包含了什么?如何计算一个类的大小?


###### 7.2 类对象的储存方式



> 
> 只保存成员变量,成员函数存放在公共的代码段。
> 
> 
> 


![image-20221013090615266](https://img-blog.csdnimg.cn/img_convert/8bf4405f250233bb3f3f4d9fb1a26281.png)


问题:计算机真的是按照这样的方式来存储的?



//1.类中既有成员变量,又有成员函数
class A1
{
public:
void f1(){}
private:
int _a;
};
//2.类中仅有成员函数
class A2
{
public:
void f2(){}
};
//3.类中仅有成员变量
class A3
{
private:
int _a;
};
//4.类中啥也没没有
class A4
{};
cout<<"A1: “<<sizeof(A1)<<” A2: “<<sizeof(A2)<<” A3: “<<sizeof(A3)<<” A4: "<<sizeof(A4)<<endl;


让我们运行一下:


![image-20221013091512349](https://img-blog.csdnimg.cn/img_convert/b09182d432c078ab8bf10d14b0a867ca.png)


类中既有成员变量,又有成员函数 与 类中仅有成员变量的大小是一样的,都是4(1,3大小一样)。


类中仅有成员函数与类中啥也没有大小一样,都是1(2,4大小一样)。



> 
> 结论:一个类的大小,实际就是该类中“成员变量”之和,当然要注意内存对齐。
> 
> 
> 



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/ae8b040a3f3245b24f8ae0c147bbcb15.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

A4: "<<sizeof(A4)<<endl;

让我们运行一下:

image-20221013091512349

类中既有成员变量,又有成员函数 与 类中仅有成员变量的大小是一样的,都是4(1,3大小一样)。

类中仅有成员函数与类中啥也没有大小一样,都是1(2,4大小一样)。

结论:一个类的大小,实际就是该类中“成员变量”之和,当然要注意内存对齐。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-SKz7Ka3c-1713337771277)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值