C++零散知识点

来源:互联网 发布:r语言lda函数源码 编辑:程序博客网 时间:2024/04/30 14:39

1. 今天写程序,写了这样一行代码:char * pArr[10] = new char[20]; 后来发现这样写是不对的。= 号左边是char** 类型的,右边是char*类型的,不可以赋值的。也不可以这样写: char * pArr[10]={new char[20]}; 这样只是对数组里的第一个元素里的指针初始化了内存区域,其他9个元素没有被分配内存。这里可以在花括号里写10个“new char[20]"并用逗号分隔。还可以用for循环给数组的10个元素分别初始化。其实不考虑内存的浪费,这里一开始声明一个二维数组就可以啦:char Arr[10][20];

2. 将const关键字用于指针有两种方法,一种是让指针指向一个常量对象,如 int age=3; const int * p=&age;或者 int const * p=&age; 这种情况下,不可以通过指针修改指向的age的值,因为指针指向的是一个int型的常量,但是允许将指针指向另一个位置。另一种是将指针本身声明为常量,如 int age =3; int * const p=&age; 这种情况下,指针只能指向age,即指针指向的地址不可以被改变了,但是可以通过指针修改age的值。

3. const 和引用参数。先明确两个概念:左值参数是可被引用的对象,例如,变量、数组元素、结构成员、引用和被解除引用的值。非左值参数包括字面常量和包含多项的表达式。假设有这样一个函数,double refcube(double &ra); 当程序试图使用像refcube(x+3.0)这样的函数调用的时候,编译器将会发出警告,因为表达式x+3.0并不是变量。如果当初这样声明函数 double refcube(const double &ra),则c++允许refcube(x+3.0)这样调用函数,这时生成了临时变量,并将其初始化为表达式x+3.0的值,这是c++的一种新的限制。当引用参数是const时,c++将在下面两种情况下生成临时变量:a)实参的类型正确,但不是左值; b)实参的类型不正确,但可以转换为正确的类型。临时变量只在函数调用期间存在。那为什么只有加了const才允许创建临时变量呢,因为在不加const的情况下,如果接受引用参数的函数的意图是修改作为参数传递的变量,则创建临时变量将阻止这种意图的实现,解决方法是禁止创建临时变量。如果refcube()函数的目的只是使用传递的值而不是修改它们,那么创建临时变量不会造成任何不利的影响,反而会使函数在可处理的参数种类方面更通用。

4. strcpy_s() 是一个比strcpy()安全的函数,这里说下我编程中遇到的问题。当时我在运行有下面这样一个构造函数的程序时,出现了崩溃,原因就是第二个参数给的值是错误的,应该改为strlen(s)+1(style是char * 的指针):

HasDma(const char * s){ style = new char[std::strlen(s) + 1]; strcpy_s(style, std::strlen(s), s);}

看下它的三个参数的版本的原型:

errno_t strcpy_s(   char *strDestination,   size_t numberOfElements,   const char *strSource );

注意,这里的numberOfElements,指的的是buffer的大小。

 5. 内存对齐的唯一原则:数据必须放在这样内存地址,其内存地址为类型大小的整数倍。对于:

struct TEST {int a;char b:1;char c:2;int d;}ts;

sizeof(ts) = 12。但是这里注意,b和c实际上是占用了一个字节。关于位域的内容参考《C语言中的关于“位域”的说明》这篇博客。

6. 虚函数实现了晚绑定, 析构是从最外层(晚派生)向最里层(早派生)进行析构,如果析构函数里使用虚机制,则有可能绑定到一个比当前需要析构的派生层次更晚派生的一个层次的方法上,而这一层次,已经被析构掉了,这就会出现异常。所以C++编译器忽略析构函数中使用的虚机制。意思是:即使你在析构函数中调用了其他的虚函数,也仅仅是执行本类中的行为,不会绑定到其他类中,也就是说,忽略了虚机制。

7. 比较好的求一般数组元素个数的方法是:

sizeof(arr)/sizeof(arr[0]);
8. 当把数组作为一个参数传入时,怎么方便的知道数组大小呢?

一个也把数组的大小作为参数传入,还有一种方法就是在数组的最后一个元素设一个特殊值,这样在函数内部就可以通过这个特殊值来判定有没有达到数组的末尾。