1. struct 和 class 的区别

weixin_41743817 2018-02-18 11:28:30
1. struct 和 class 的区别
(1) C的struct与C++的class的区别。
(2) C++中的struct和class的区别。

(1) struct是一种数据类型定义,不能定义函数。
(2) C++中的struct和class的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

类私有变量的调用可以通过共有函数来调用
友元函数是为了让除了类的成员函数以外的函数可以访问到类的私有成员。
友元关系不能被继承
友元不具备任何继承性,只对当前类有效

Class是什么
class是定义类的关键字

2. Linux 用法
grep文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep命令的常用格式为:grep [选项] ”模式“ [文件]

文本中搜索一个单词
grep match_pattern file_name

3. 定义在类里面的友元函数和类外的友元函数有什么区别?
使用友元函数可以数据共享,提高效率,从而使两个类共享同一函数。
(1)友元函数不是类的成员函数,定义在类内或者类外没有区别。
(2)含有friend关键词的友元声明只是权限的声明,并不是正式的函数声明,故在使用它之前还需要一次正式的函数声明。
怎么创建线程和进程

4. 进程和线程的区别:
1 . 每个进程都有各自独立的内存空间,而线程没有独立的内存空间;
2 . 线程必须要运行在进程之内,换句话说没有进程,就不会有线程;
3 . 线程可以共享进程的内存空间;


5. 析构函数与纯析构函数

6. 静态数据成员用法
静态数据成员被当作是类的成员,属于类定义的一部分。静态数据成员是该类的所有对象所共有的,静态数据成员只分配一次内存。
静态数据成员可以是private成员,而全局变量不能。

7. 关于静态成员函数,可以总结为以下几点:
出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。

全局变量和静态变量都是保存在静态存储区中,生命期和程序一样,但是不同的是全局变量的作用域是整个项目,而静态全局变量是当前程序文件,静态局部变量则是当前函数体内
静态局部变量只会被初始化一次
静态全局变量可以被初始化多次
<数据类型><类名>::<静态数据成员名>=<值>


8. C++中基类的析构函数为什么要用virtual虚析构函数
基类指针指向派生类对象,当delete的时候只会析构父类的析构函数,不会析构子类的析构函数,因为虚函数是动态绑定的,现在析构函数不是virtual的,因此不会发生动态绑定,而是静态绑定,指针的静态类型为基类指针,因此在delete时候只会调用基类的析构函数。

8.c++中 虚函数与纯虚函数的区别是什么?
虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是:
(1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。
(2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。

C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。
定义一个函数为虚函数,不代表该函数未被实现,只是为了来实现多态。
定义一个函数为纯虚函数,才表示函数未被实现 ,定义它是为了实现一个接口,起一个规范作用。继承抽象类的派生类要实现这个函数…


9.C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:
•不存在空引用。引用必须连接到一块合法的内存。
•一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
•引用必须在创建时被初始化。指针可以在任何时间被初始化。
引用通常用于函数参数列表和函数返回值

10.内联函数
内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数。
当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。

11.函数模板
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
用函数模板只能用于 函数的参数个数相同而类型不同的情况,如果参数个数不同,则不能使用函数模板。
template<typename T>

12.类模板
一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

13.const
被const修饰的变量是表示一个常量,这个数是不能被改变的

14.delete 与 delete[] 区别针对类Class
class A
{
};
A *a = new A[10];
// 仅释放了a指针指向的全部内存空间但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
delete a;

// 调用使用类对象的析构函数释放用户自己分配内存空间并且 释放了a指针指向的全部内存空间
delete [] a;

15.在C++中,3种对象需要复制,此时拷贝构造函数会被调用
1)一个对象以值传递的方式传入函数体
2)一个对象以值传递的方式从函数返回
3)一个对象需要通过另一个对象进行初始化

16.虚函数表
包含虚函数的类才会有虚函数表,虚函数表实质是一个指针数组,里面存的是虚函数的函数指针。

17.C++中各种数据类型占据字节长度
1个字节是8位
1.整形:int、long
32位系统一个内存单元是是32位,所以是4字节;64位操作系统一个内存单元是16位,故占8个字节。

2.字符型:char、wchar_t
char类型通常占据一个字节,对于用于扩展字符集的wchar_t类型,需要占据两个字节。

3.布尔型:bool
bool占据一个字节

4.浮点型:float、double
float占据4个字节,double是float的两倍即8个字节

5. 指针
指针字节长度计算原理其实跟int差不多,一个指针的位数和操作系统的位数是相等的,即32位系统应该是4个字节,64位系统应该是8个字节

18.一级指针和二级指针
一级指针:即我们一般说的指针,就是内存地址;
二级指针:指向指针的指针,就是地址的地址;
用二级指针作为函数参数,有两种典型情况:1.需要传递一级指针的数组时2.需要对传入的一级指针进行修改时

19.VIM基本模式
普通模式
插入模式
可视模式
命令行模式

20. Linux下面的进程间通信与线程中间的联系
进程是线程的容器,进程提供资源,内存。里面的线程利用进程的资源,内存执行代码。多线程是一个进程里面包含多个线程,他们共享进程里面的资源和内存空间,所以多个线程可以通过全局变量进行通信。
多进程通信就必须系统调用产生进程共享的内存,也可以用文件,可以通过网络等方法。

21.C++中的继承和组合区别使用
若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。
若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。

22.在c++中,vector是一个十分有用的容器。
作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于可遍历类中的数据结构。这些集合可能是容器,也可能是容器的子集。

23.如何选择这三个容器中哪一个,应根据你的需要而定,具体可以遵循下面的原则:
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
list是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。

24.什么是多态
这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态。
子类重写父类的方法,指向子类的父类指针,在调用函数的时候会调用子类的函数而不是父类的函数 父类函数前加关键字virtual

25.函数重载
同名函数的形式参数(指参数的个数、类型或者顺序)必须不同
常用来实现功能类似而所处理的数据类型不同的问题
重载函数的参数个数、参数类型、参数顺序、这三者中至少要有一个不同,才能进行函数重载,因为调用重载函数就是要根据这个来区分具体的调用哪个函数,而函数的返回值可以相同可以不同。
26.函数重载
构造函数可以被重载,析构函数不可以被重载。因为构造函数可以有多个且可以带参数。

27.数据抽象
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。

28.接口
C++ 接口是使用抽象类来实现的
接口描述了类的行为和功能,而不需要完成类的特定实现。C++ 接口是使用抽象类来实现的。
子类需要被实例化,则必须实现每个虚函数,如果没有在派生类中重载纯虚函数,就尝试实例化该类的对象,会导致编译错误。
29. 数据封装与数据抽象
数据封装是一种把数据和操作数据的函数捆绑在一起的机制,C++ 通过创建类来支持封装和数据隐藏
数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制

30.动态内存
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

31.基于进程和基于线程
同一个进程中可以包括多个线程,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。

Template <class或者也可以用typename T>
返回类型 函数名(形参表)
{//函数定义体 }

32.运算符重载
重载运算符有一个返回类型和一个参数列表
Box operator+(const Box&);
函数为类的非成员函数,那么我们需要为每次操作传递两个参数
Box operator+(const Box&, const Box&);
...全文
766 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sczyq 2018-03-06
  • 打赏
  • 举报
回复
struct 不能定义函数。这个肯定是错的。误导。
ooolinux 2018-02-22
  • 打赏
  • 举报
回复
@早打大打打核战争 C++的struct和class区别不大了,不过没有人把struct当class用。
  • 打赏
  • 举报
回复
(1) struct是一种数据类型定义,不能定义函数。这个肯定是错的。
hongss 2018-02-22
  • 打赏
  • 举报
回复
这个不错
ooolinux 2018-02-19
  • 打赏
  • 举报
回复
帮顶,楼主自己总结的?

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧