C/C++基础-001

1.C++虚函数的工作原理

  虚函数(virtual function)需要虚函数表(virtual table)才能实现。如果一个类有函数声明成虚拟的,就会生成一个虚函数表,存放这个类的虚函数地址。若子类没有覆写虚函数,该子类的虚函数表就会存放父类的函数地址。调用这个虚函数时,就会通过虚函数表解析函数的地址。在C++中,动态绑定(dynamic bindding)就是通过虚函数表机制实现的。

2.深拷贝和浅拷贝的区别

  浅拷贝会将对象所有成员的值拷贝到另一个对象里。使用浅拷贝时,必须非常小心,只有当我们知道自己在做什么时才可选用浅拷贝。多数情况下,使用浅拷贝是为了传递一块复杂结构的信息,但又不想真的复制一份数据。使用浅拷贝时,销毁对象也必须非常小心。

  深拷贝除了拷贝所有成员的值,还会进一步拷贝所有的指针对象。

  在实际开发中,浅拷贝很少使用。大部分情况都应该使用深拷贝,特别是当需要拷贝的结构很小时。

 1 struct Test
 2 {
 3      char * ptr;
 4 };
 5
 6 void shallowCopy(Test & src , Test & dest)
 7 {
 8    dest.ptr =  src.ptr;
 9 }
10
11 void deepCopy(Test & src , Test & dest)
12 {
13     dest.ptr = (char * )  malloc(strlen(src.ptr) + 1 );
14     strcpy(dest.ptr , src.ptr);
15 }

3.C语言的关键字“volatile”的作用

  关键字volatile的作用是指示编译器,即使代码不对变量做任何改动,该变量的值仍可能会被外界修改。操作系统、硬件或其他线程都有可能修改该变量。该变量的值有可能遭受意料之外的修改。所以,每次使用时,编译器都会重新从内存中获取这个值。

  volatile的整数声明语句:

1 int volatile x;
2 volatile int x;

  声明指向volatile整数的指针:

volatile int *  x;
int volatile *  x;

  指向非volatile数据的volatile指针很少见,但也是可行的:

int * volatile x;

  如果声明指向一块volatile内存的volatile指针变量(指针本身与地址所指向的内存都是volatile),volatile变量不会被优化掉。

int volatile * volatile x;

  volatile变量在多线程程序里很有用,对于全局变量,任意线程都可能修改这些共享的变量。我们可能不希望编译器对这些变量进行优化,我们就可以使用volatile关键字。

4.C++基类的析构函数声明为virtual的原因

  确保正确调用继承关系最末端的子类的析构函数。

时间: 2024-11-06 07:07:45

C/C++基础-001的相关文章

学习之路-现代密码学基础-001

学习之路-现代密码学基础-第一章密码学概论

java语言基础001

1.java程序的基本结构大体上可以分为包.类.main()主方法.标识符.关键字.语句和注释等. 2.标识符和关键字区分大小写. 3.主方法是应用程序的入口点,java程序是从该方法开始执行的,main是主方法的名称,程序员不可以更改. 4.标识符 是一个名字,用来标识类名.变量名.方法名.数组名.文件名的有效字符序列. 5.标识符的命名规则: (1)java语言的标识符由字母.数字.下划线和美元符组成,第一个字符不能为数字. 非法:7word.5fox (2)java 语言使用Unicode

算法Sedgewick第四版-第1章基础-001递归

一. 方法可以调用自己(如果你对递归概念感到奇怪,请完成练习 1.1.16 到练习 1.1.22).例如,下面给出了 BinarySearch 的 rank() 方法的另一种实现.我们会经常使用递归,因为递归代码比相应的非递归代码更加简洁优雅.易懂.下面这种实现中的注释就言简意赅地说明了代码的作用.我们可以用数学归纳法证明这段注释所解释的算法的正确性.我们会在 3.1 节中展开这个话题并为二分查找提供一个这样的证明.编写递归代码时最重要的有以下三点.? 递归总有一个最简单的情况——方法的第一条语

java基础-001

一.区分final . finally . finalize 1.关键字final Java语言的关键字final可以用于变量.类或方法,但是含义会有所不同. -用于变量:一旦初始化,变量值就不能修改 -用于方法:该方法不能被子类重写(overrride) -用于类:该类不能派生出子类 2.关键字finally 关键字finally和try/catch语句配对使用,即使有异常抛出,也能确保某段代码一定会执行.finally语句块会在try/catch语句块之后,在控制权交回之前执行. 3.fin

py基础 001

Python诞生 Python是著名的”龟叔“Guido van Rossum(吉多·范罗苏姆)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python语法很多来自C,但又受到ABC语言的强烈影响.来自ABC语言的一些规定直到今天还富有争议,比如强制缩进.但这些语法规定让Python容易读.Guido van Rossum著名的一句话就是Life is short, you need Python,译为:人生苦短,我用Python截至到目前2016年4月28日,Pytho

[JavaWeb基础]001.简单的JavaWeb代码和Tomcat配置部署

简介: 其实说明白了就是J2EE应用开发,前端可以有很多的展现方式,后端由Java做逻辑运算和数据支撑.适用于创建服务器应用程序和服务,为搭建具有可伸缩性.灵活性.易维护性的商务系统提供了良好的机制. 工具介绍: IDE:MyEclipse 10.0 服务器:Tomcat6.0 平台:windows8.1(我的系统,其他的也可以) 下面我们开始讲解如何建立一个简单的web应用程序. 1.创建一个web项目    2.输入项目名称    3.点击完成.       我们就创建了一个简单的web应用

Spring Aop 实现拦截器功能之基础 - 001

环绕通知用 @Around  注解来声明 可以决定这个方法在什么时候执行,如何执行,甚至是否执行 通知的第一个参数必须是 ProceedingJoinPoint 类型 如下 @Pointcut("execution(* com.sxb.web.v2.wh.unittest2.aop.PersonServiceBean.save(..)) || execution(* com.sxb.web.v2.wh.unittest2.aop.PersonServiceBean.update(..))&quo

[基础-001]C++字符串转换(char*,const char*,string)

1. string转const char* 1 string str ="abc"; 2 const char* charArr = str.c_str(); 2. const char*转string 1 const char* charArr = "abc"; 2 string str(charArr); 3. string转char* 1 string str ="abc"; 2 char* charArr; 3 const int len

Java基础001:final关键字、String字符串的相加问题

1.final关键字的作用 1.1.final修饰的类:不能被其他类继承:1.2.final修饰的方法:不能被子类重写1.3.final修饰的变量:分两种情况,引用变量.基本类型变量,如下: final修饰的引用变量:一旦给其赋值,就不能被再次赋值 final String s = "32"; //引用变量 s = "1"; /** 报错:The final local variable s cannot be assigned. It must be blank