C与C++的区别
c++在c的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
问3:什么是面向对象(OOP)?
答:面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。
对象:在面向对象编程中,对象是程序的基本构建单元。在图书馆系统中,我们可以创建对象来代表图书、借阅者和图书馆自身。
类:类是对象的蓝图或模板。每个类定义了对象的属性(成员变量)和方法(成员函数)。例如,我们可以创建一个名为Book
的类来定义图书对象,包括书名、作者、出版日期等属性,以及借书和还书等方法。
封装:封装是将数据和操作数据的方法捆绑在一起的概念。在图书馆系统中,我们可以将图书对象的属性和方法封装在Book
类中,以确保数据的安全性和可维护性。
继承:继承允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个名为LibraryMember
的子类,它继承了一般Person
类的属性,同时具有一些特有的属性和方法。
多态:多态是一种机制,允许不同类的对象对相同的消息作出不同的响应。在图书馆系统中,不同类型的对象(例如Book
和LibraryMember
)可以响应不同的操作,如借书或还书。
#include
#include
class Book {
public:
Book(const std::string& title, const std::string& author, int year)
: title_(title), author_(author), year_(year) {}
void Borrow() {
// 实现借书逻辑
std::cout << "Book borrowed: " << title_ << std::endl;
}
void Return() {
// 实现还书逻辑
std::cout << "Book returned: " << title_ << std::endl;
}
private:
std::string title_;
std::string author_;
int year_;
};
class LibraryMember {
public:
LibraryMember(const std::string& name, int memberId)
: name_(name), member_id_(memberId) {}
void BorrowBook(Book& book) {
// 实现借书逻辑
book.Borrow();
}
void ReturnBook(Book& book) {
// 实现还书逻辑
book.Return();
}
private:
std::string name_;
int member_id_;
};
int main() {
Book book("The Catcher in the Rye", "J.D. Salinger", 1951);
LibraryMember member("Alice", 1001);
member.BorrowBook(book);
member.ReturnBook(book);
return 0;
}
问6:STL库用过吗?常见的STL容器有哪些?算法用过哪几个?
答:
STL包括两部分内容:容器和算法。(重要的还有融合这二者的迭代器)
容器,即存放数据的地方。比如array等。
在STL中,容器分为两类:序列式容器和关联式容器。
序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;
关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。
下面各选取一个作为说明。
vector:它是一个动态分配存储空间的容器。区别于c++中的array,array分配的空间是静态的,分配之后不能被改变,而vector会自动重分配(扩展)空间。
set:其内部元素会根据元素的键值自动被排序。区别于map,它的键值就是实值,而map可以同时拥有不同的键值和实值。
算法,如排序,复制……以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。
迭代器是STL的精髓,我们这样描述它:迭代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。
问7:数据结构会吗?项目开发过程中主要用到那些?
答:数据结构中主要会用到数组,链表,树(较少),也会用到栈和队列的思想。
问8:const知道吗?解释其作用。
答:
1.const 修饰类的成员变量,表示成员常量,不能被修改。
2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数。
3.如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数。
4.const 函数只能调用 const 函数。非 const 函数可以调用 const 函数。
5.类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符
问10:堆和栈的区别?堆和栈的生命周期?
答:
一、堆栈空间分配区别:
1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
二、堆栈缓存方式区别:
1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、堆栈数据结构区别:
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。
问11:解释下封装、继承和多态?
答:
一、封装:
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
二、继承:
继承主要实现重用代码,节省开发时间。
子类可以继承父类的一些东西。
三、多态
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
问12:指针和引用的区别?
答:
1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
7. 指针和引用的自增(++)运算意义不一样;
8. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
9.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
问13:什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?
答:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。
使用的时候要记得指针的长度。
malloc的时候得确定在那里free.
对指针赋值的时候应该注意被赋值指针需要不需要释放.
动态分配内存的指针最好不要再次赋值.
问15:new和malloc的区别?
答:
1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2、对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
3、由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
问19:说下你对内存的了解?
答:
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
5 程序代码区,存放2进制代码。
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。