总结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:联合体的大小是其最大成员的大小
二维数组,行可省,列不可省
指针的值只能是地址
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:联合体的大小是其最大成员的大小
相关文章推荐
- error C2064: 项不会计算为接受 2 个参数的函数 1> 类不会将“operator()”或用户定义的转换运算符定义到指向函数的指针或指向函数的引用(它们接受适当数量的参数
- 总结函数的参数,指针参数及const修饰的情况
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- C++知识点总结(上):指针和引用,static关键字,const关键字,malloc\free和new\delete的区别等
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 总结函数的参数,指针参数及const修饰的情况
- 面试宝典5,6,7--程序设计基本概念;预处理、const与sizeof;指针与引用
- C++中的几个关键字(static、const、#define、inline、sizeof与strlen、指针与引用、new与malloc)
- C++面向对象、const和指针混用、函数参数的默认值
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
- C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)
- 总结函数的参数,指针参数及const修饰的情况
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 指针,static,const,引用,violate等等
- 双指针函数参数什么时候需要加 const,什么时候不能加?
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- C/C++几个常见概念分析(指针、引用 、const常量、#define)