C和C++有什么区别?
1) C++是C的一种超集,除了很少的例外(请参阅本节和本节),大多数C程序也可以在C++中工作。
2) C是一种过程编程语言,但是C++支持过程和面向对象的编程。
3)由于C++支持面向对象的编程,因此它支持诸如函数重载,模板,继承,虚拟函数,朋友函数之类的功能。这些功能在C中是不存在的。
4) C++支持语言级别的异常处理,在C中,异常处理以传统的if-else样式完成。
5) C++支持引用,而C不支持。
6)在C语言中,scanf()和printf()主要用于输入/输出。 C++主要使用流来执行输入和输出操作。 cin是标准输入流,而cout是标准输出流。
还有更多不同之处,以上是主要区别列表。
引用和指针之间有什么区别?
无论引用和指针可以用来更改另一个函数中一个函数的局部变量。当作为参数传递给函数或从函数返回时,它们都还可以用于保存大对象的副本,以提高效率。
尽管有上述相似之处,但引用和指针之间仍存在以下差异。
引用不如指针强大
1)创建引用后,以后就不能再引用另一个对象了;它不能被重新安置。这通常是通过指针完成的。
2)引用不能为NULL。指针通常被设置为NULL,以指示它们没有指向任何有效的对象。
3)引用必须在声明时进行初始化。指针没有这种限制
由于上述限制,C++中的引用不能用于实现链接列表,树等数据结构。在Java,引用没有上述限制,可以用于实现所有数据结构。 Java的引用功能更强大,这是Java不需要指针的主要原因。
参考更安全,更易于使用:
1)更安全:由于必须初始化引用,因此不太可能存在诸如野指针之类的野引用。仍然可能有引用未引用有效位置的引用(请参阅以下练习中的问题5和6)
2)易于使用:引用不需要解引用运算符即可访问该值。它们可以像普通变量一样使用。仅在声明时才需要“&”运算符。同样,可以使用点运算符(’。’)访问对象引用的成员,这与需要箭头运算符(->)访问成员的指针不同。
什么是虚函数-编写示例?
虚函数与继承一起使用,它们是根据指向或引用的对象的类型而不是根据指针或引用的类型来调用的。换句话说,虚拟函数在运行时解析得较晚。 Virtual关键字用于使函数虚拟化。
编写具有运行时多态性的C++程序(使用虚函数)需要做以下事情
1)基类和派生类。
2)在基类和派生类中具有相同名称的函数。
3)指向或引用派生类的对象的基类类型的指针或引用。
例如,在下面的程序中,bp是类型Base的指针,但是对bp-> show()的调用将调用Derived类的show()函数,因为bp指向Derived类的对象。
#include
using namespace std;
class Base {
public:
virtual void show() { cout<<" In Base \n"; }
};
class Derived: public Base {
public:
void show() { cout<<"In Derived \n"; }
};
int main(void) {
Base *bp = new Derived;
bp->show(); // RUN-TIME POLYMORPHISM
return 0;
}
输出:
In Derived
这是什么指针?
“ this”指针作为隐藏参数传递给所有非静态成员函数调用,并且可用作所有非静态函数主体内的局部变量。 “ this”指针是一个常量指针,用于保存当前对象的内存地址。 “ this”指针在静态成员函数中不可用,因为可以在没有任何对象(带有类名)的情况下调用静态成员函数。
我们可以做“删除”吗?
参见https://www.geeksforgeeks.org/delete-this-in-c/
什么是VTABLE和VPTR?
vtable是函数指针表。它是按类维护的。
vptr是指向vtable的指针。它是按对象维护的(请参阅示例)。
编译器在两个位置添加了其他代码,以维护和使用vtable和vptr。
1)在每个构造函数中编写代码。此代码设置要创建的对象的vptr。此代码将vptr设置为指向该类的vtable。
2)使用多态函数调用的代码(例如,上面代码中的bp-> show())。无论在何处进行多态调用,编译器都会插入代码以首先使用基类指针或引用查找vptr(在上面的示例中,由于指向或引用的对象是派生类型,因此将访问派生类的vptr)。一旦获取了vptr,就可以访问派生类的vtable。使用vtable,可访问和调用派生派生类函数show()的地址。
你也许也喜欢:
- 在C++上练习测验
- C / C++文章