您的位置:首页 > 其它

总结1->sizeof-默认值参数的函数-static-指针和引用概念-const-CAS

2017-10-14 21:59 309 查看
数组打印-1下标的不会崩,是无效值。

二维数组,行可省,列不可省

指针的值只能是地址

char<unsigned char<short<unsigedshort<int<unsigned int<long<unsigned long<float<double

当派生类中不含对象成员时

· 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;

· 在撤消派生类对象时,析构函数的执行顺序是:派生类的构造函数→基类的构造函数。

当派生类中含有对象成员时

· 在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;

· 在撤消派生类对象时,析构函数的执行顺序:派生类的构造函数→对象成员的构造函数→基类的构造函数。

逗号运算符运算方向从左到右,逗号表达式的值等于最右边的式子的值

c和c++const的区别

析构构造函数不能为const


const的右边没有参与指针或引用的话,不影响编译器制造变量的类型:const int   和 int 在类型上编译器都认为是int
const修饰的初始化(不分为0不为0)全局变量都在只读数据段,修饰的局部变量都在栈上。(c++要是有&,才会给分配内存)
      c中
       const修饰的变量可以不初始化,不初始化的全局变量在bss段,局部无区别。
       在c中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲突,编译时报错。
       常变量:(用数组来说)
      c++中const较为复杂,一般分为两类(类外和类中)
      类外:
        const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放
        在c++中,const变量(在这里涉及的const都不是类中的const,类中的const专门提出来记录)默认是内部连接的,因此在不同的编译单元中可以有同名的const 变量定义。
       函数参数或者返回值能使用 const & or const * 时,尽量使用const属性,增强程序健全性。
        int b = 10;   const int a = b;//c++有时也会退化成常变量,初始化为立即数不存在这种问题。

       //内置类型产生的临时量都是const量

       //自定义类型产生的临时量都是变量(隐式产生的临时对象是const对象)

      类中:

        类中的const和c语言中的const有点像,都是常变量。

        类中的const 变量占用存储空间,但是也必须在构造函数初始化列表上初始化

        隐式生成的对象是常对象

        const对象只能调用const成员函数。

指针和引用的区别:
        (1)指针可以有多级,但是引用只能是一级(c11新规则则不同,左引用,右引用)
         (2)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
         (3)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
         (4)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
         (5)指针和引用作为函数参数进行传递时的区别。
         (6)两者汇编上指令是一样的
在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象,其能被赋值。
         函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
static
       c语言static
             静态局部变量
             (1)该变量在全局数据区分配内存(局部变量在栈区分配内存);
            (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
            (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
             (4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存);
              静态全局变量
              静态全局变量不能被其它文件所用;
              其它文件中可以定义相同名字的变量,不会发生冲突;
              静态函数只能被本文件使用
       c++静态成员函数

       1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

       2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;

       3.静态成员函数不能访问非静态成员函数和非静态数据成员;

       4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)

系统的CAS(compare and set)操作

       int count = 0;

       atomic_increment(&count);  保证++的原子操作   atomic(原子)

       atomic_decrement(&count);  保证 -- 的原子操作

带默认值参数的函数

       默认参数的目的:允许函数默认参数值,是为了让编程简单

 
     默认参数的声明:默认参数在函数声明中提供,当又有声明又有定义时,定义中不允许默认参数。如果函数只有定义,则默认参数才可出现在函数定义中。

 
     默认参数的顺序规定:如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值 ,默认参数应从右至左逐渐依次定义。当调用函数时,向左依次匹配参数。

 
     注意: 若在定义时而不是在声明时置默认值,那么函数定义一定要在函数的调用之前。因为声明时已经给编译器一个该函数的向导,所以只在定义时设默认值时,编译器只有检查到定义时才知道函数使用了默认值。若先调用后定义,在调用时编译器并不知道哪个参数设了默认值。所以我们通常是将默认值的设置放在声明中而不是定义中。

sizeof总结

sizeof是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数。其返回值类

型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值。

sizeof有三种语法形式

      1) sizeof( object ); // sizeof( 对象 );
      2) sizeof( type_name ); // sizeof( 类型 );
      3) sizeof object; // sizeof 对象;      sizeof int; // error

      类型

     1.sizeof对表达式求值,求值结果与表达式最终结果的类型有关。

2.sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。

C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都 

是错误的:sizeof(
foo );// error

void foo2() { }

sizeof( foo2() );// error

3.sizeof的常量性:sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如:
char ary[ sizeof( int ) * 10 ]; // ok

4.指针变量的sizeof:32位下为4byte,64位下为8

5.数组的sizeof:数组的sizeof值等于数组所占用的内存字节数

6.结构体的sizeof:要考虑到内存字节对齐。pragma
pack的基本用法为:#pragma pack( n ),n为字节对齐数,

其取值为1、2、4、8、16,默认是8

7.联合体的sizeof:联合体的大小是其最大成员的大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐