C/C++
一、编程语言的标识符
C语言:
1、 标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1,prog_to。
2、 不能把C语言关键字作为用户标识符,例如if,for,define,while等。
3、 标识符长度是由机器上的编译系统决定的,一般的限制为8字符。
4、 标识符对大小写敏感,即严格区分大小写。一般对变量名用小写,符号常量名用大写。
5、 标识符命名应做到“见名知意”,例如长度(length),求和、总计(sum),圆周率(pi)……
C语言中把标识符分为三类:关键字,预定义标识符,用户自定义标识符。
C++语言:
1、 标识符由字母、数字、下划线“_”组成。
2、 不能把C++关键字作为标识符。
3、 标识符长度限制32字符。
4、 标识符对大小写敏感。
5、 首字符只能是字母或下划线,不能是数字。
二、构造函数
定义:
构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
主要特点:
1、 构造函数的命名必须与类名完全相同,可以带参数和重载。
2、 构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。
3、 构造函数不能被直接调用,必须用new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。
4、 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可以省略。
5、 构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(C++)。
6、 当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
C++构造函数:
C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正的创造一个对象。
三、头结点
数据结构中,在单链表的第一个节点之前附设一个节点,他没有直接前驱,称之为头结点。
所谓头结点,是为了使空链表和非空链表的处理统一而在链表的头部增加的一个节点,这样无论链表是否为空,头指针都指向头结点,头结点中不存数据而只是存放指向第一个节点的指针。没有头结点的链表,头指针就指向第一个节点。因此,单链表为空时,head==NULL。
四、cout
cout用于在计算机屏幕上显示信息,是C++中iostream类型的对象,C++的输出是用“流”(stream)的方式实现的,流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中,即<iostream>库,该库定义的名字都在命名空间std中,所以cout全称是std::cout。
cout语句的一般格式为:
cout<<表达式1<<表达式2<<……<<表达式n;
在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或‘\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。
一个cout语句可以分写成若干行。如:
cout<<”This is a simple C++ program.”<<endl;
可以写成:
cout<<”This is” //注意行末尾无分号
<<”a C++”
<<”program.”
<<endl; //语句最后有分号
也可以写成多个cout语句,即
cout<<”This is”; //语句末尾有分号
cout<<”a C++”;
cout<<”program.”;
cout<<endl;
以上三种情况均输出为:
This is a simple C++ program.
注意:
不能用一个插入输出符“<<”插入多个输出项,如:
cout<<a,b,c; //错误,不能一次插入多项
cout<<a+b+c; //正确,这是一个表达式,作为一项
在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则:
cout<<a<<’ ’<<b<<’ ’<<c<<endl;
会以下面的形式输出:
4 345.789 a
五、数组指针
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int(*p)[10];p为指向数组的指针,又称数组指针。
本质与区别:
数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如int *p[3],定义了p[0],p[1],[2]三个指针),其本质为数组。
数组是数组,指针是指针。数组名代表被分配的内存的首地址,是一个地址常量,是右值;而指针作为变量,却是一个左值。
六、++
“++”是C和C++等高级语言里的自增运算符,使可变左值加一。
用法主要有两种:
i++;
++i;
操作说明:
l i++:先引用,后增加
l ++i:先增加,后引用
l i++:先在i的表达式中使用i的当前值,后让i加1
l ++i:先让i加1,然后在i所在的表达式中使用i的新值
七、函数输入参数
对于只做输入的参数:
a) 始终用const限制所有指向只输入参数的指针和引用。
b) 优先通过值来取得原始类型和复制开销比较低的值的对象。
c) 优先按const的引用取得其他用户定义类型的输入,
d) 如果函数需要其他参数的副本,则可以考虑通过值传递代替通过引用传递。这在概念上等同于通过const引用传递加上一次复制,能够帮助编译器更好的优化掉临时变量。
#include <stdio.h>
int main()
{
int intArray[] = {1,2,3,4,5};
int *p = (int *)(&intArray+1);
printf("%d,%d",*(intArray+1),*(p-1));
return 0;
}
输出结果为:2,5
解析:主要理解这句话:int *p=(int *)(&intArray+1);
intArray:是数组的首地址,
&intArray:就是存放这个数组首地址的地址,可以用int(*)[5]的指针保存,
&intArray+1:相当于int(*)[5]这个指针的指针偏移,偏移量是指向元素的大小*1,
(比如double *p,p+1的偏移量就是一个double的大小*1)
(int *)(&intArray+1):相当于把偏移后的地址(也就是int[5])强制转给p保存;
可得p指的是数组intArray结尾的下个地址,用二维数组理解的话就是intArray是第一个
int[5],即int[0][5],p指的是int[1][5]。
*/