1. 关于strcpy
char str1[5];
char* str2= "01234";
strcpy( string, str2);
以上代码会出现什么问题:str1需要6个字节才能存放下str1的内存,而str1定义的大小为5,因此会出现数组越界。
char str1[5], str2[5];
int i;
for(i=0; i<5; i++)
{
str1 = 'a';
}
strcpy( str2, str1 );
由于未给str1的最后一个字符赋结尾字符’\0’,因此该赋值不能再str1数组内结束,同时造成str1赋值给str2的字节数不确定。
2. sizeof 与 strlen 的区别
sizeof是一个单目操作符,而不是函数。作用是计算其操作数的存储空间。操作数可以是一个表达式或者一个类型。如sizeof(int)。
strlen是一个函数,只能用char *做参数,且必须是以’\0’结尾的,计算有效字符串的字符数。
详细见链接:
http://blog.csdn.net/sunnyyoona/article/details/39118465
http://blog.csdn.net/yanzi1225627/article/details/7838877
3. 函数的重载,覆盖和隐藏
以下三个链接把涉及到的知识点讲得很详细:
http://blog.csdn.net/qq_26437925/article/details/54933326
http://blog.csdn.net/sinat_20265495/article/details/52487445
http://blog.csdn.net/myth_hg/article/details/48970863
C++ 类层次中的同名函数,有三种关系:
重载(overload)
重写、覆盖(override)
隐藏(hide,oversee)
要注意三个处在类中的位置,以及重载的二义性(默认参数),不能将返回值不同设为重载的性质。
4. 结构体与类的区别
在C++中,结构体是一种特殊形态的类。
结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性。
类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private)
结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有类型(public)
C++中,不使用结构体丝毫不会影响程序的表达能力。C++之所以要引入结构体,是为了保持和C程序的兼容性。
但有时仍会在C++中使用结构体,是因为,可以使用结构体将不同类型数据组成整体,方便于保存数据。(若用类来保存,因类中成员默认为私有,还要为每个数据成员特定函数来读取和改写各个属性,比较麻烦。)
C语言中结构体不允许定义函数成员,且没有访问控制属性的概念。
C++为C语言中的结构体引入了成员函数、访问控制权限、继承、包含多态等面向对象特性。
C++在struct之外引入了class关键字,但为了保持与C程序的兼容,C++保留了struct关键字,并规定结构体默认访问控制权限为公有类型。
另外,C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1。
C++中空类的大小为1的原因:
空类也可以实例化,类实例化出的每个对象都需要有不同的内存地址,为使每个对象在内存中的地址不同,所以在类中会加入一个隐含的字节。
原文链接:http://www.cnblogs.com/Carrie-0173/p/6357715.html
5. float和double的存储结构
参考文章:
http://www.cnblogs.com/wuyuankun/p/3984385.html
6. 关于内存泄漏
内存泄漏的几种情况:
http://blog.csdn.net/lovely20085901/article/details/39050085
一些内存泄漏的检测工具:
https://www.ibm.com/developerworks/cn/linux/l-cn-memleak/
多线程安全:
http://blog.csdn.net/yinxin2745154/article/details/43344373
7. 虚函数表
http://www.cnblogs.com/findumars/p/6358207.html?utm_source=itdadao&utm_medium=referral
8. C++ const的用法及作用
参考这篇文章,讲得非常得不错。
http://blog.csdn.net/Eric_Jo/article/details/4138548
9. 默认初始化
若定义变量时未指定初值,则变量被默认初始化。默认值是多少取决于:(1)变量类型;(2)定义变量的位置。
对于内置类型,默认值由变量定义的位置决定,定义于任何函数体之外的变量(即全局变量)被初始化为0,定义在函数体内部的内置类型变量将不被初始化(将会取决于编译器,对于g++,局部变量同全局变量的默认初始化,若为VS,则是未知的,编译会出现警告,运行时会报错:变量未被初始化)。一个未初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将引发错误。
对于类来说,如果没有显示地初始化,则其值由类自己决定,如果类要求必须初始化对象,则定义未初始化的对象会引发错误。