尊重函数接口,尽量不作内部改动
C++代码语句分为:内置类型,名字,变量,操作符,标量,字符串,预处理指示(如#)等
C++中定义类来组织数据结构
标准库的头文件用尖括号 括起来,非标准库的头文件用双引号 ” ” 括起来。
对象是内存中具有类型的区域。
在C++中,初始化和赋值是两种不同的操作。
内置类型变量在任何函数外如不初始化,系统都会初始化为0,在函数体内如不初始化则可能发生错误(除了用作左操作数)。
有些类类型有默认构造函数,因此定义其对象时可以不显式地提供初始化。
在 C++ 语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量,声明变量不分配内存,因此声名不初始化,若声明同时初始化则视为定义。
关键字用于声明。全局域定义的非 const 变量默认为 。要使 const 变量能够在其他的文件中访问,必须得指定它为 。
要理解的重要概念是引用只是对象的另一名字,初始化是指明引用指向哪个对象的唯一方法。如int val = 1024;int & = val;//是val的引用,当int I = ;相当于int I = val;引用是一种复合类型。
enum是枚举关键字enum {,,,};表示花括号内成员默认为0,1,2,3都是const变量,用来初始化枚举成员的值必须是一个常量表达式,但枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。是一个枚举类型。
C++ 中,通过定义类来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对象可以执行的操作。接口()和实现()。
定义变量和定义数据成员存在非常重要的区别,类中定义的变量称为数据成员,当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。
C++中也可以使用关键字来定义类,它与class的区别在于类中第一个访问标号前的成员默认为,而class默认为。注意只是对于类外语句调用权限而言,在类内部成员函数可以随意调用成员。
头文件用于声明而不是定义,因为定义只可以出现一次,而头文件在多个源文件中出现,所以只用于声明。对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 函数。头文件中含有支持分别编译所需的类定义及变量和函数的声明。
C++预处理器是在编译之前运行带有预处理标志#的程序,如#指示允许两种形式和“”,前者表示标准库头文件,后者表示自定义头文件。#预处理器变量,通常全部大写字母。可以用:
#
#
// of and goes here
#
首先第一句判断是否定义,若没有则第二句定义该预处理器变量,直到#endif结束。若第一句判断出已经定义,则忽略后面的内容。此预处理命令可以用于避免头文件在被程序多次包含时内部定义的类被反复定义,引起编译错误。
类型的输入操作符1;表示1100变为0110(6)。
赋值操作返回左值,具有右结合性。
j = i++与j = ++i的区别,前者自增操作符返回初值,后者返回自增后的值。尽量使用前置自增。
C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:->箭头操作符。
如: *sp = &item1; (*sp).(item2);等效于sp->(item2);
运用new和语句创建和撤销动态内存,即可创建和释放动态数组也可创建和释放单个对象,如:int *pi = new int; 表示在自由存储区(堆)分配了一个整型对象,并返回该对象的地址,并用该地址初始化指针pi。
又如:int *pi = new int(20); 同时初始化该整型对象为20。 *ps = new ; 的默认构造函数将其初始化为一个空字符串。若要显式初始化非默认初始化的对象,可写为:
int *pi = new int();在类型名后面加圆括号表示初始化为空值,这样做可以避免因未初始化带来的错误。
pi; 表示释放pi所指向内存,但pi中保存的地址仍存在,此时pi成为悬垂指针,易发生错误,应立即将pi置0,以显示它未指向任何对象。使用删除非自由存储区的内存是不合法的。
对于const对象,须返回const对象地址,如:const int *pi = new const int(1024);
C风格字符串是一个const char型字符数组:const char *ps = “C style”; 以空字符为结束位;C++标准库用类型重新定义了字符串,更加简单直观: ps(“ ”);
尽量使用类来定义字符串。
C++编译器在隐式类型转换时会尽可能防止精度损失。强制类型转换的一般格式为:
cast-name() ;其中cast-name是要强制转换的方式,如;
等,type是欲转换为的类型。尽量避免使用强制类型转换。
语句每个case后要加break,否则程序只会跳过后续的case标号继续执行case标号内的内容。若要在case中定义变量,则使用花括号限定变量的使用范围。
C++异常处理关键字:throw和try{}catch{}catch{}…;了解一下,throw用于退出代码块,转向异常处理。try一段代码,catch其中的语句,作相应处理。标准库定义的异常处理类都在头文件中。
函数形参使用引用修改实参的值安全而方便,尽量不使用指针。
函数中如不需要修改实参的值,则统一使用const形参引用,如:下列程序在s中查找c字符:
:: ( &s,char c){
:: i = 0;
while(i != s.size() && s(i) != c )
++i;
i;
}
若调用此函数(“”,’s’); 则出现编译错误,字符串和字符字面值是右值,可以通过const &s 引用,此处字面值常量先隐式转化为一个临时const对象再初始化const &s。
区分int *[10 ]; 和int (*) [10];前者表示包含10个指针的指针数组,后者表示指向含有10个int型元素的数组的指针。数组下标优先级大于指针操作符。
int main(int argc, char *argv[]) 中,argv是一个c风格的字符串数组,char *argv[]相当于char **argv,argc保存argv的字符串个数。
左值可出现在赋值语句的右侧或左侧,而右值只能出现在赋值号的右侧。函数返回值用于初始化在调用函数处建立的临时对象。因此,函数可返回引用作为左值:const &(const &s1,const &s2),形参和返回类型都是引用。但不要返回局部对象的引用,同样,可以返回指针,但不能返回局部对象的指针,否则会成为悬垂指针。
递归函数是直接或间接调用自身的函数,必须要有中止条件,否则会无限循环。如:定义一个递归函数求取1×2×3……100的值:
int f(int val){
if (val > 1) f (val-1)*val;
val;
}1234
函数声明可省略形参名,一般在声明阶段提供默认实参: (:: width = 80, :: = 20, char = ‘c’); 当调用函数时,初始化值会从左向右覆盖默认实参值,因此应将最有可能变更的默认实参放在最左边。函数声明一般整理放在头文件中,在源文件中包含头文件。
函数中,每个名字都有作用域,每个对象都有生命期,形参和局部变量的生命期在函数调用过程中,它们的名字作用域限于函数块中从定义到快结束之间。若我们希望一个局部对象在函数调用结束后仍然具有生命,则可以定义静态局部变量:关键字。
定义内联函数是为了编译器在处理函数时按照函数块内语句展开,节省直接处理函数带来的花销。在普通函数前加关键字,并只能在头文件中定义。
类的成员函数在类内声明,可以在类外定义,也可以在类内定义。其形参表包含一个隐式形参this指针,初始化为调用该成员函数的对象地址,如:在类中定义的成员函数:
bool (const &rhs) const {
isbn == rhs.isbn;
}123
在调用total.(trans)时,花括号前的const表明隐式指针this是一个指向total对象的const * 类型的指针,该函数称为常量成员函数。 isbn == rhs.isbn相当于:
this->isbn == rhs.isbn; 函数体中可以显式地使用后者语句,但没有必要。
构造函数是一种特殊的成员函数,用于初始化类,同名构造函数可以重载,由不同数目或类型的形参表区分。构造函数没有返回类型,和类同名。
通常,我们将类放在与类同名的头文件中定义,而成员函数放在与类同名的源文件中定义。
每个版本的重载函数应在同一个作用域中声明,局部同名函数会覆盖全局函数而不是重载。
以上即为C++必知必会知识点总结,如有更新后续补充,希望大家有收获。
学习IT相关内容,找“职坐标在线”
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666