语法
来源:互联网 发布:奇迹时代3 知乎 编辑:程序博客网 时间:2024/04/29 02:51
1.c++融合了3种不同的传统编程:过程性语言传统,面向对象语言传统,通用编程传统。c++强调的是实用价值,不是意识形态方法。
过程性编程强调的是算法,OOP强调的是数据。
美国国家标准局ANSI和国际标准化组织ISO一起创建了联合组织ANSI/ISO,致力于制定C++标准。
最后的C++国际标准ISO/IEC 14882:1998获得了ISO,IEC(国际电工技术委员会),ANSI的批准。2003年发布了C++标准第二版(IOS/IEC 14882:2003)
ANSI/ISO C++标准还起草了ANSI C语言标准,之前的K&R C有时被称为经典C(Classic C)。1999年的最新C标准称为C99。
C++前景专题
http://soft.yesky.com/lesson/311/2421811.shtml
2.新的C++头文件不使用扩展名,并且名字前加c,可以使用名称空间。
3. C++中,main不是关键字,它不是语言的组成部分。
4.内置的C++类型分为两组,基本类型和复合类型。
基本类型包括整数和浮点数。
复合类型是在基本类型的基础上创建的,包括字符串,指针,数组,结构。
字节是描述计算机内存量的度量单位。c++中字节的位数跟使用的字符集有关。unicode字符集中,字节可能是16位或32位。
实际上,short 是short int的简称,long是long int的简称。
2的8次方=256
2的15次方=32768,3万2千,32M。
2的16次方=65536,6万5千,64M。
2的32次方=4294967296,约43亿,4G。
5.sizeof是操作符,不是函数,编译器具体实现它的时候,大多数是个系统宏,它的参数是一个类型,如果是变量,测由编译器推到这个类型,之后计算这个类型的大小,即字节数。
计算数组长度,数组个数
用来计算数组的元素个数的宏:#define COUNTOF(arr) sizeof(arr)/sizeof(arr[0]),如 int arr[10],countof(arr)结果是10,不过在编程中,这个数组的长度是已知的,不必进行这个计算。sizeof(arr) 计算的就是arr的大小 ,40字节。
COUNTOF宏不写为一个函数,因为sizeof是在编译时计算结果,而不支持在运行时计算结果,arr如果被传给函数,它可能变为指针了,sizeof(arr)的结果变为了4。
sizeof 对变量操作时,可以不用括号,对类型操作时,必须加括号。
sizeof运算符工作原理与普通函数有区别,其计算是在编译期完成,不会占用运行时时间和空间。用它来计算动态数组如指针数组的大小就不适合。
sizeof那道笔试题的秘密 http://ticktick.blog.51cto.com/823160/318727
sizeof关键词给出了存储传入的变量或者类型(包括聚合类型)所需要的字节数。该关键词返回size_t类型的变量。当应用到一个结构类型或变量,sizeof返回实际的大小,这可能包括为了字节对齐而填充的字节。当应用于静态维数组,sizeof返回整个数组的大小。 sizeof运算符不能返回动态分配的数组或外部的数组的大小。
6.初始化句法:
int a=5;//c 句法
int a(5);//c++句法
7.#define 编译指令是c语言留下来的,c++中更好的使用const创建符号常量。不过,若在被设计成可用于c/c++的头文件中,必须使用#define.
8. 数字常量后面的字母后缀用于表示类型,l或L表示long,u或U表示unsigned int,UL表示unsigned long。
9.char最常用来存储字条,它也可以看作比short更小的整形。c++对字符使用单引号,对字符串使用双引号。可以将数字直接赋给char常量。
10.8进制表示以0开头,16进制以x开头。
11.通用字符名:用来表示特殊字符,使用方法类似于转义序列。
\u后面是以十六进制表示的8位,\U后面是以十六进制表示的16位,
12.wchar_t表示扩展字符集,
13.任何数字,指针值都可以隐式转换为bool
14.浮点数分两部分存储:基准值和缩放因子。缩放因子的作用是移动小数点的位置,因此称为浮点。
c++有两种书写浮点数的方式:标准小数点表示法和E表示法。如3.45E6,E6指乘以10的6次方。E左边的值称为尾数,E右边的值称为指数。3.45E-6,E-6指除以10的6次方。
3种浮点类型:float,double,long double。例如:1.0为double类型,1.0F为float,1.0L为long double。
15.有效位是数字中有意义的位。
通过查看cfloat头文件,以十进制表示时, float类型最少有6位有效位,double有15位,long double有18位。
将浮点数赋给整形变量时,将扔掉小数部分,而不是四舍五入。但当浮点数太大时,赋值的结果将是不确定的。
16.在c++中数组声明的格式 int shortArr[5]={1,1,1,1,1}; 中括号在变量后面,java中可能前后都可。
1.引用,请记住一个引用仅仅是一个名字,一个实际存在的对象的名字。无论何时只要你看到一个引用的声明,你应该立刻问自己它是什么东西的另一个名字,因为它必定是某物的另一个名字。
基类成员-基类构造函数-派生类成员-派生类构造函数
2. 0结束符.
c语言中的字符串叫做c风格字符串,它是一串以0结尾的连续字节数组,它也可以以char数组的形式表示。因为char是有符号的8位字节表示,而ascii码范围只是00000000到01111111。
处理二进制数据,即以字节流方式读取或处理数据时,不要混淆进0结尾的概念,二进制数据中可能包含很多0。这时要多提供一个长度参数来对数据范围界定。
3.
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; //false
cout << boolalpha << ( str3==str4 ) << endl;//false
cout << boolalpha << ( str5==str6 ) << endl; //true
boolalpha 的作用是用符号形式表示真假。
4. 以下两段定义是否正确,为什么?
(1).
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
(2).
const std::string exclam = "!";
world" + exclam;
答:
(2)是错误的
编译器报错:invalid operands of types `const char[6]' and `const char[8]' to b inary `operator+'
(2) 错误的原因是无法计算 "Hello" + ", world", 因为加法是从左到右计算的, 而语言没有定义两个char *的加法,所以报错。
(1)题没有问题因为第一个加法触发string string::operator+(const string&)返回以后可以继续加法操作!
(1).中 hello + ", world" 后(hello + ", world")就变成是"string"类型了,所以(hello + ", world") + "!"....;就是"string"类型 用 string::operator +(const string&) 对(hello + ", world") 与"!" 进行字符串连结操作
(2).中 "Hello" + ", world" 中间的"+"是标准运算符,所以处理不了两个char*的相加操作
5.继承
公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
6.访问修饰符
(1)、class定义时,前面不能有修饰符。(如果是在.NET平台上开发的话,可以设置/clr编译选项)
(2)、class中的成员默认是private的,而struct和union中的成员默认是public的。(C#中class和struct里面的所有成员默认都是private)
(3)、子类是class,父类默认是private继承; 子类是struct,父类默认是public继承; 而Unions不能继承其他的对象。如下:
class BaseClass
{
public:
int age;
protected:
int sex;
};
class MyClass1 : BaseClass // 默认是private
{
};
struct MyStruct: BaseClass // 默认是public
{
};
不要忘记了c++提供了另一种访问权限,友元。友元函数可以访问类的私有成员。
友元类的所有方法都可以访问原始类的私有成员及保护成员。
友元被授予从外部访问授予类的私有部分的权限。友元并不与面向对象的编程思想相悖,它提高了公有接口的灵活性。
7.构造函数成员初始化列表中的成员初始化顺序,与它们在头文件中声明的成员顺序一致。所以,要总是按声明顺序编写成员初始化列表。
c++之所以采用这样的设计,是因为要确保销毁成员的顺序唯一。
8. MyClass类中的静态成员变量 static OtherClass*instance需要在实现文件中初始化.
格式 OtherClass*MyClass::instance = 0;
9.c++中静态函数调用方法是 类名::静态函数
java中是类名.静态函数
10.new types may not be defined in a return type
是因为#include中某一个头文件的class定义最后没有加上分号。
11.三元运算符
height=height>0?:20;
12.switch和if else
相比之下,if else更通用,它可以处理取值范围,
swich不适合处理范围取值,case标签值必须是整数常量,包括char和枚举,不能处理浮点测试。
switch后面的表达式的值返回的是整形值,或者能转换为整形的值;case后面的值是整形或者能转换为整形的常量或者常量表达式。
在 vc工程中测试 const int a=1;a作为case标签值,在cpp文件中编译链接通过,在c文件中报"case 表达式不是常量"。
在xcode3.2.5 sdk4.2中测试,m文件中编译不通过,报case label does not reduce to an integer constant 错误,在mm文件中编译通过。
gcc编译器认为const int a=1; const限定的变量和常量表达式不同。
但改成LLVM compiler 1.6则编译链接成功。
只要定义一个变量,不管是不是 const,编译器都要给它分配地址。
13.宏
打印出当前源文件的文件名以及源文件的当前行号:
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。