C/C++教程

C++ Primer Plus学习笔记

本文主要是介绍C++ Primer Plus学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

C++ Primer Plus

第1章 预备知识

区分扩展名

  • C++程序使用.C或者.cpp作为扩展名,C程序使用.c作为扩展名

  • 对于某些UINX系统,也可使用扩展名cc和cxx

  • DOS不区分大小写

    源代码文件的扩展名
C++实现 源代码文件的扩展名
UNIX C、cc、cxx、c
GNU C++ C、cc、cxx、cpp、c++
Digital Mars cpp、cxx
Borland C++ cpp
Watcom cpp
Microsoft Visual C++ cpp、cxx、cc
Freestyle Code Warrior cp、 cpp、 cc、cxx、c++

第2章 开始学习C++

1、C++语句

  • 语句是要执行的操作
  • C与C++使用终止符(terminator)而不是分隔符
  • 终止符是一个分号(;)符,他是语句结束的标志,是语句的组成部分
有以下类型C++语句
  • 声明语句:定义函数中使用的变量的名称和类型。
  • 赋值语句:使用赋值运算符(=)给变量赋值。
  • 消息语句:将消息发送给对象,激发某种行动。
  • 函数调用:执行函数。被调用的函数执行完毕后,程序返回到函数调用语句后面的语句。
  • 函数原型:声明函数的返回类型、函数接受的参数数量和类型。
  • 返回语句:将一个值从被调用的函数那里返回到调用函数中。

2、C++注释

  • C++注释以//打头,到行尾结束
  • C++也能识别C的注释/**/
  • 尽量使用C++风格注释

3、C++源代码风格

  • 每条语句占一行
  • 每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行。
  • 函数中的语句都相对于花括号进行缩进。
  • 与函数名称相关的圆括号周围没有空白。

4、命名约定

有以下几种

  • Myfunction( )
  • myfunction( )
  • myFunction( )
  • my_function( )
  • my_funct( )

选择取决于开发团体、使用的技术或库以及程序员个人的品位和喜好。


第3章 处理数据

1、变量名命名规则

  • 在名称中只能使用字母字符、数字和下划线(_)。
  • 名称的第一个字符不能是数字。
  • 区分大写字符与小写字符。不能将C++关键字用作名称。
  • 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
  • C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。

2、变量长度

  • bool,

  • short(short为short int的简称)至少16位(bit),两个字节(bytes),表示范围-3276832767*,*(*即*-2^152^15-1);

  • w_char(宽字符类型),可以表示扩展字符集,是一种整数类型,长度不确定

  • char,1byte=8bit;表示范围不确定,默认情况下无符号,是否有符号有C++实现决定

    • signed char,表示范围-128~127
    char fodo;//可能有符号,可能没符号
    unsigned char bar;//无符号
    signed char snark;//有符号
    
  • C++11新增类型

    • char16_t:无符号,长16位
    • char32_t:无符号,长32位
    • C++11使用前缀u表示u表示char16_t字符串常量和字符常量,如:u'C'和u"be good";前缀U表示char32_t字符串常量和字符常量,如:U'C'和U"be good"
    • 与wchar_t一样,char16_t和 char32_t也都有底层类型——一种内置的整型,但底层类型可能随系统而已。
  • int被设置为对目标计算机而言最为“自然”的长度,自然长度(natural size)指的是计算机处理起来效率最高的长度。int至少与short一样长,4byte=32bit,所能表示范围:-21474836482147483647*;*(*即*-2^312^31-1);

  • long(long为long int的简称)至少32位,且至少与int一样长,4byte=32bit,所能表示范围:-21474836482147483647*;*(*即*-2^312^31-1);

  • long long 至少64位,且至少与long一样长。

  • float,至少32位,指数范围至少是-37到37

  • double,至少48位,且不少于float,指数范围至少是-37到37

  • long double,位80、96或128位,指数范围至少是-37到37

可以从头文件cfloat或float.h中找到系统的限制。

注:wchar_t类型是一种整数类型,它有足够的空间,可以表示系统使用的最大扩展字符集。这种类型与另一种整型(底层(underlying)类型)的长度和符号属性相同。对底层类型的选择取决于实现,因此在一个系统中,它可能是unsigned short,而在另一个系统中,则可能是int。cin和 cout将输入和输出看作是char流,因此不适于用来处理 wchar_t类型。iostream头文件的最新版本提供了作用相似的工具——wcin和 wcout,可用于处理 wchar_t流。另外,可以通过加上前缀L来指示宽字符常量和宽字符串

3、运算符sizeof

可对类型名或变量名使用sizeof运算符。

  • 对类型名(如 int)使用sizeof运算符时,应将名称放在括号内;
  • 对变量名(如n_short)使用该运算符,括号是可选的。
cout << "int is" << sizeof(int) << " bytes.\n";
cout << "short is " << sizeof n_short << " bytes.\n";

4、头文件limits

头文件climits 定义了符号常量来表示类型的限制。INT_MAX表示类型 int能够存储的最大值,对于Windows 7系统,为2147483 647。编译器厂商提供了climits文件,该文件指出了其编译器中的值。例如,在使用16位int 的老系统中,climits文件将INT_MAX定义为32767。下表对该文件中定义的符号常量进行了总结,其中的一些符号常量与还没有介绍过的类型相关。

climits中的符号常量
符号常量 表示
CHAR_BIT char的位数
CHAR_MAX char的最大值
CHAR_MIN char的最小值
SCHAR_MAX signed char的最大值
SCHAR_MIN signed char的最小值
UCHAR_MAX unsigned char的最大值
SHRT_MAX short的最大值
SHRT_MIN short的最小值
USHRT_MAX unsigned short的最大值
INT_MAX int的最大值
INT_MIN int的最小值
UNIT_MAX unsigned int的最大值
LONG_MAX long的最大值
LONG_MIN long的最小值
ULONG_MAX unsigned long的最大值
LLONG_MAX long long的最大值
LLONG_MIN long long 的最小值
ULLONG_MAX unsigned long long的最大值

5、C++11初始化方式

C++11使得大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。

int hamburgers = {24};//初始化方式一
int emus{7};//初始化方式二
int rheas = 12;//初始化方式三

6、无符号类型

  • unsigned char:所占内存大小:1byte=8bit;所能表示范围:0255*;*(02^8-1)

  • unsigned(unsigned int):所占内存大小:4byte=32bit; 能表示范围:04294967295*;*(*即*02^32-1)

  • unsigned long: 所占内存大小:4byte=32bit;所能表示范围:04294967295*;*(*即*02^32-1)

7、整型字面值

  • 十进制

    int chest = 10;
    
  • 八进制:前缀为0

    int inseam = 042;
    
  • 十六进制:前缀为0x或0X

    int waist = 0x42;
    
  • 如果要以十六进制或八进制方式显示值,则可以使用cout的一些特殊特性。控制字符dec、oct和hex分别用于指示cout以十进制、八进制和十六进制格式显示整数。

    cout << dec;
    //表示cout显示十进制数
    ......
    cout << oct;
    //表示cout显示八进制数
    ......
    cout << hex;
    //表示cout显示十六进制数
    ......
    

8、确定常量的类型

  • long:后缀为L或l,如:100L
  • unsigned int:后缀为U或u,如:100U
  • unsigned long:后缀为UL(LU,lu,ul),如100ul
  • long long:后缀为LL或ll,如100LL
  • unsigned long long:后缀为ULL(LLU,llu,ull),如100ull

接下来考察长度。在C++中,对十进制整数采用的规则,与十六进制和八进制稍微有些不同。对于不带后缀的十进制整数,将使用下面几种类型中能够存储该数的最小类型来表示: int、long或long long。在 int 为 16位、long 为 32位的计算机系统上,20000被表示为 int 类型,40000被表示为long类型,3000000000被表示为long long类型。对于不带后缀的十六进制或八进制整数,将使用下面几种类型中能够存储该数的最小类型来表示:int、unsigned int long、unsigned long、long long或unsigned long long.在将40000表示为long 的计算机系统中,十六进制数Ox9C40 ( 40000)将被表示为unsigned int。这是因为十六进制常用来表示内存地址,而内存地址是没有符号的,因此,usigned int 比 long更适合用来表示16位的地址。

9、C++转义字符

C++转义字符表
字符名称 ASCII符号 C++代码 十进制ASCII码 十六进制ASCII码
换行符 NL (LF) \n 10 0xA
水平制表符 HT \t 9 0x9
垂直制表符 VT \v 11 0xB
退格 BS \b 8 0x8
回车 CR \r 13 0xD
振铃 BEL \a 7 0x7
反斜杠 \ \\ 92 0x5C
问号 ? ? 63 0x3F
单引号 ' \' 39 0x27
双引号 " \" 34 0x22

10、const限定符

创建常量的通用格式

const type name = value;//在C++中尽量用const取代#define

常量指针:const修饰指针,指针指向可以变,指针指向的值不可以变

const int * p = &a;

指针常量:const修饰的是常量,指针指向不可以变,指针指向的值可以变

int * const p = &a;

const即修饰指针又修饰常量:指针指向不可以变,指针指向的值也不可以变

const int * const p = &a;

11、浮点数的表示

12.34//float
2.52e+8//E的表示法,+可省略,E大小写皆可
-18.32e-13//E的表示法,-不可省略

1)定点表示法

ostream方法 setf(),迫使输出使用定点表示法,以便更好地了解精度,它防止程序把较大的值切换为E表示法,并使程序显示到小数点后6位。参数 ios_base:.fixed 和ios_base::floatfield是通过包含iostream来提供的常量。

#include<iostream>
int main ()
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    //迫使cout输出使用定点表示法,并使程序显示到小数点后6位
    ......
    return 0 ;
}

2)浮点常量

  • float:后缀为f或F,如:1.2f
  • double:默认浮点数都是double,如:8,24和2.4E8
  • long double:后缀为l或L,如1.234L

12、除法分支

  • 整数/整数=整数(小数部分省略)

  • double/double = double

  • double/int = double

  • int/double = double

  • double/double = double

  • float/float = float

13、求模运算

求模符号:%

规则:只能为整数,x(x>=n)与n求模,求模后取值为小于n的整数,如:

//与二求模
	for(int i=1;i<=10;i++){
		//TODO
		cout << i << "%2 = " << i%2 << "  ";//与2求模,求模后取值0,1,为小于2的整数
	}
	cout << endl;
	
	//与三求模
	for(int i=1;i<=10;i++){
		//TODO
		cout << i << "%3 = " << i%3 << "  ";//与3求模,求模后取值0,1,2,为小于3的整数
	}
	cout << endl;

14、类型转换

转换规则

C++11对这个校验表稍做了修改,下面是C++11版本的校验表,编译器将依次查阅该列表:

  1. 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
  2. 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
  3. 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
  4. 否则,说明操作数都是整型,因此执行整型提升。
  5. 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
  6. 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
  7. 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
  8. 否则,将两个操作数都转换为有符号类型的无符号版本。

有符号整型按级别从高到低依次为long long、long、int、short和 signed char。无符号整型的排列顺序与有符号整型相同。类型char、signed char和unsigned char的级别相同。类型bool 的级别最低。wchar_t、char16_t和char32_t 的级别与其底层类型相同。

强制类型转换

(typeName) value;//方法一,C语言版
typeName (value);//方法二,C++版,新格式的想法是,要让强制类型转换就像是函数调用一样
//C++还引入了4个强制类型转换运算符,对它们的使用要求更为严格
statistic_cast<typeName> (value)

15、C++11中的auto声明

C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。为此,它重新定义了auto的含义。auto是一个C语言关键字,但很少使用。在初始化声明中,如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:

auto n = 100;//n为int
auto x = 1.5;//x为double
auto y = 1.3e12L;//y为long double

显式地声明类型时,将变量初始化0(而不是0.0)不会导致任何问题,但采用自动类型推断时,这却会导致问题。


第4章 复合类型

1、数组

//声明数组
typeName arrayName[arraySize];

表达式arraySize 指定元素数目,它必须是整型常数(如10)或const值,也可以是常量表达式(如8*sizeof ( int)),即其中所有的值在编译时都是已知的。具体地说,arraySize不能是变量,变量的值是在程序运行时设置的。然而,本章稍后将介绍如何使用new运算符来避开这种限制。

未完待续。。。

这篇关于C++ Primer Plus学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!