C/C++语法

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,则是未知的,编译会出现警告,运行时会报错:变量未被初始化)。一个未初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将引发错误。
对于来说,如果没有显示地初始化,则其值由类自己决定,如果类要求必须初始化对象,则定义未初始化的对象会引发错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值