本文共 2165 字,大约阅读时间需要 7 分钟。
封装、继承、多态
为变量分配地址和存储空间的称为定义,不分配地址的成为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明
此变量将在文件以外或在文件后面部分定义。
sizeof是一个操作符,strlen是库函数
sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数
编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。
首先,C++是C的超集,所以static在C中的用法 对于C++来说是全盘接受的,而两者的不同也就是C++中多出来的特性,而这些多出来的特性与C++面向对象的特性有关,或更具体的说,就是static在“类”中的意义和作用。
1:C语言中的Static使用: 1.1 C中static变量 的影响其实不在作用域而在于 其“存储方式”: 即在函数内定义的static变量,其作用域仍然在函数内;在函数外定义的static变量,其作用域也在函数外,属于变量所在的文件的作用域。 static 的静态存储方式使得:同一函数的所有static变量的“副本”都共用一个该变量。所以使用了static变量的函数一般是“不可再入”的,不是“线程安全”的。 1.2 C中static函数 的作用: C中static函数还有另外一个名字,叫:内部函数。从名字也可看出,C中的static函数的定义将函数“局部化”,使其访问权限被限制在当前文件内部,这实际上说明的是一种“代码的隐藏机制”,通过和extern函数(外部函数)的联合使用,可以实现C语言中函数的模块化设计,这有点类似与C++ 中的Public和private关键字的味道。 当然,如果在C中,函数默认的访问权限是extern的,所以关键字extern往往省略不写。 2: C++类中定义的Static变量和函数 其实本质上与C中的情况一致,不在于作用域(还是类的作用域),而在于其“存储方式”决定了Static变量将与类存储在一起(因为类本身在内存中有其原型的内存空间),而类的实例将共享这一static变量,所以static变量也不是“线程安全”的。 而static成员函数的设置,主要是为了访问静态变量,或者完成某些独立于类实例的功能。
volatile告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取。指针和普通变量一样,有时也有变化程序的不可控性。
常见的例子:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。(以下是摘抄的问题)
1)一个参数既可以是const还可以是volatile吗?解释为什么。
2) 一个指针可以是volatile 吗?解释为什么。3) 下面的函数有什么错误:
int square(volatile int *ptr) { return *ptr * *ptr; }
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2)是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3)这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
long square(volatile int *ptr) { int a; a = *ptr; return a * a; }
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是
你所期望的平方值!正确的代码如下:
a是一级指针,&a是二级指针
#incudevoid main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return ;}
输出结果:2,5
注意,只有当实际使用这些函数的时候,编译器才会去定义它们。
1.缺省构造函数
2.缺省拷贝构造函数
3.缺省析构函数
4.缺省赋值运算符
5.缺省取址运算符
6.缺省取址运算符const
(1)拷贝构造函数生成新的类对象,而赋值运算符不能
(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算符中如果原来的对象中有内存分配,要先把内存释放掉。
(3)当类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不能使用默认的。
转载地址:http://viumi.baihongyu.com/