提前声明:
本文内容为华北水利水电大学研究生C++课程,如有 侵权请告知,作者会予以删除
1.C++特点
1.历史悠久。2.应用广泛。3.兼容c。4.面向对象。5.适合编写系统程序。6.有助于理解计算机的工作过程,深入理解计算机的原理和概念
2.各种开发语言的优缺点
编程语言 | 优点 | 缺点 | 移植性 |
C | 编写小而快的程序, 程序运行效率非常高;很容易与汇编语言结合;具有很高的标准化。 | 不容易支持面向对象技术。语法有时会非常难以理解,并造成滥用。 | C语言的核心具有很好移植性 |
C++ | 组织大型程序时比C语言好。支持面向对象机制。运行效率高。 | 非常大而复杂。与C语言一样存在语法滥用问题。 | 比较好 |
汇编语言 | 最小、最快的语言。 | 难学、语法晦涩。额外代码太多。 | 接近零 |
VB | 编辑环境整洁。易学。拥有大量可用的插件。 | 程序很大,而且运行时需要几个巨大的运行时动态连接库。调用Windows的API非常笨拙。 | 非常差 |
JAVA | 可移植到其他平台。程序可以在网页中运行。内含的类库非常标准且极其健壮。自动分配和垃圾回收避免程序中资源泄漏。 | 使用一个“虚拟机”来运行可移植的字节码而非本地机器码,程序将比真正编译器慢。 | 最好。但,很多新功能在某些平台上不稳定。 |
C# | 简化和现代化了C++在类、名字空间、方法重载和异常处理等领域。屏弃了C++的复杂性。 | C#编写的程序必须运行在.NET平台 | 差 |
3.举例子:输入圆的半径,求圆的周长和面积
3.1一般方法
/* 注释方法一
this is a simple programcount the girth and area of circle */
// 注释方法二 count the girth and area of circle
#include<iostream>//预编译指令
using namespace std ;//使用标准命名空间
int main ()//函数头;int 函数返回值类型;main 主函数名,系统预定义;参数表(没有参数不能省略圆括号){ double r, girth, area ; const double PI = 3.1415 ;cout << "Please input radius:\n" ;cin >> r ; girth = 2 * PI * r ; area = PI * r * r ;cout << "radius = " << r << endl ; cout << "girth = " << girth << endl ;cout << "area = " << area << endl ;
}
/*函数体:{}花括号相括的语句序列各语句以分号结束(大家经常会忘记的) 一行可以写多个语句一个语句可以分多行书写*/
/*
函数是程序基本运行单位,一般形式为:
类型 函数名 ( 参数表 )
{语句序列
}
*/
运行结果
3.2面向对象(代码与课堂内容不同,有些许改动)
//利用面向对象的思想进行计算圆的周长和面积
#include<iostream>
using namespace std ;
class Circle
{ double radius ;public ://定义类的类的公有成员 void Set_Radius( double r ) { radius = r ; }double Get_Radius() { return radius ; }double Get_Girth() { return 2 * 3.14f * radius ; }double Get_Area() { return 3.14f * radius * radius ; }
} ;
int main()
{double r; //定义半径变量 cout << "Please input radius:\n" ;cin >> r ; //输入圆的半径 Circle A;//实例化圆的对象 A.Set_Radius(r) ;//调用类中公有成员方法进行圆的半径设置 ; 通过对象调用类的成员函数cout << "A.Radius = " << A.Get_Radius() << endl ;cout << "A.Girth = " << A.Get_Girth() << endl ;cout << "A.Area = " << A.Get_Area() << endl ;
}
运行结果如下
4.关键词(保留字)
关键字是系统预定义的单词。C++不允许对关键字重定义。
C++常用的关键字:
auto break case char class const continue default delete else
enum explicit extern float for friend goto if inline int long
new operator private protected public register return short signed
sizeof static struct switch this typedef union unsigned virtual
void while
5.标识符
语法:以字母或下划线开始,由字母、数字和下划线组成的符号串
注意:1.不能使用关键字作用户标识符;2.C++中,字母大小写敏感;(Name与name不同)3.C++没有规定标识符的长度,不同编译系统有不同的识别长度;4.标识符尽可能做到见文知义。
6.运算符
+ 加 - 减 * 乘 / 除 > 大于 < 小于 >= 大于或等于 == 等于 != 不等于 <= 小于或等于
7分隔符
用于在程序分隔不同的语法单位,便于编译系统的识别;常用的分隔符有:空格,逗号,分号,冒号,括号,注释符等
8.常数
基本类型常数在程序运行时直接参与运算,不占用内存存储
9.数据类型
9.1常用数据类型描述
1字节=8bit
9.1.1整型
9.1.1.1int
类型 | 说明 | 字节 | 范围 |
short [int] | 短整型 | 2 | -32768~32767 |
signed short [int] | 有符号短整型 | 2 | -32768~32767 |
unsigned short [int] | 无符号短整型 | 2 | 0~65535 |
int | 整型 | 4 | -2147483648~ 2147483647 |
signed [int] | 有符号整型 | 4 | -2147483648~ 2147483647 |
unsigned [int] | 无符号整型 | 4 | 0~4294967295 |
long [int] | 长整型 | 4 | -2147483648~ 2147483647 |
signed long [int] | 有符号长整型 | 4 | -2147483648~ 2147483647 |
unsigned long [int] | 无符号长整型 | 4 | 0~4294967295 |
十进制 -45L 八进制 045 十六进制 0xA1e=10×162+ 1×161+14×160 = 2590
9.1.1.2 bool
逻辑类型只有两个值:true false
9.1.1.3 enum
枚举类型
示例:
#include <iostream>
using namespace std;
//colour类型标识符 {}枚举常量
enum colour{ red, yellow, blue, white, black };
int main()
{ colour c;//枚举类型变量 c=red;cout<<"red: "<<c<<endl;c=blue;cout<<"blue: "<<c<<endl;c=black;cout<<"black: "<<c<<endl;
}
运行结果
9.1.2浮点型
float 4 字节 单精度浮点型
double 8 字节 双精度浮点型
long double 8 字节 长双精度浮点型
科学计数方式:1.23E10=1.23×1010 0.23E-4=0.23×10-4 0.23E-4f=0.23×10-4 ( 单精度 )
45.e+23L=45.0×1023 ( 双精度 )
9.1.3字符型
char 空格符" ";空字符”“;
C++常用转义字符
名称 | 字符形式 | 值 |
空字符(Null) | \0 | 0X00 |
换行(NewLine) | \n | 0X0A |
换页(FormFeed) | \f | 0X0C |
回车(Carriage Return) | \r | 0X0D |
退格(BackSpasc) | \b | 0X08 |
响铃(Bell) | \a | 0X07 |
水平制表(Horizontal Tab) | \t | 0X09 |
垂直制表(Vertical Tab) | \v | 0X0B |
反斜杠(backslash) | \\ | 0X5C |
问号(question mark ) | \? | 0X3F |
单引号(single quote) | \′ | 0X27 |
双引号(double quote) | \〞 | 0X22 |
10变量
11地址访问
2.double b ;< b, double, 0X0066FDEC >名字b所标识的浮点型对象;地址0X0066FDEC所指的浮点型对象
&为取址运算符 *间址运算符
取对象b的地址: &b;访问对象b: b *(&b)
例子:
#include<iostream>
using namespace std ;
int main()
{ int a = 451 ;const int MAX = 1000 ;//const常量 cout << a << endl ; cout << ( &a ) << endl ;cout << *( &a ) << endl ;cout << &MAX << endl ;cout << MAX << endl ;cout << * ( &MAX ) << endl ;
}
12.程序存储
13.指针变量
指针类型变量——能够存放对象地址的变量,简称“指针变量”
指针变量也分为不同的类型
int *p1 , *p2 (*代表指针类型说明);与 int a,b;差不多 a=*p1+*p2(*代表间址运算(指针运算))
例子
# include <iostream>
using namespace std ;
int main ( )
{ int i , * p ;p = & i ;* p = 5 ;cout << i << endl ;cout << * p << endl ;cout << p << endl ;cout << & i << endl ;
}
13.1指向指针的指针
#include<iostream>
using namespace std ;
int main()
{ int ****p4, ***p3, **p2, *p1, i = 3 ;p4 = &p3; p3 = &p2; p2 = &p1; p1=&i;cout << ****p4 << endl ;
}
13.2指针类型转换
示例
#include<iostream>
using namespace std ;
int main()
{ int a = 65 ;int * ip ;void * vp = &a ;//void 指针变量能够存放任意内存地址。cout << * ( int * ) vp << endl ;//强制类型转换cout << * ( char * ) vp << endl ;ip = ( int * ) vp ;cout << ( * ip ) << endl ;
}
14引用
int &ra=a;ra是a的别名只能在定义时初始化
示例
#include<iostream>
using namespace std ;
int main ()
{ int a = 2345 ;int *pa ;int & ra = a ;pa = & a ;cout << a << '\t' << ra << '\t' << *pa << endl ;cout << (&a) << '\t' << ( & ra ) << '\t' << pa << endl ;cout << ( &pa ) << endl ;
}
15常量
15.1常量指针
关键字 const 约束对象的访问性质,使对象值只能读,不能写
指针常量的值只能在定义的时候初始化
指针本身和所指对象的值在定义之后都限制为只读
例如:const double PI = 3.14159 ;
#include<iostream>
using namespace std ;
int main ()
{ const int A = 78 ;const int B = 25 ;int C = 13 ;//---------const在数据类型前-------------------- const int *pi = &A ;//*pi = 56 ;// 错误, 不能修改所指常量。此时*pi指向的是常量A。 pi = &B ;pi = &C ;// *pi = 99 ;// 错误,不能用间址方式修改对象。此时的常量指向的是变量C。 C = 99 ;cout << " *pi = " << *pi << endl ;//总结 const int这样定义的指针不能修改内容,但能修改所指的位置 cout << "----------------------------------------" << endl ;//------------const在*之后 ----------------------int *const D = &C , *p ;//此处的*p没有被常量化 *D = 1000 ; //此时D指针指向的是C变量 cout << "*D = " << *D << endl ;p = new int ;//自己开辟一个新的整数空间 *p = 2000 ;// D = p ; //错误 , 不能对地址进行修改 p = D ;cout <<" *p = " << *p << endl ;//总结 int *const 这样定义的指针能修改内容,但不能能修改所指的位置 cout << "----------------------------------------" << endl ;//----------const在数据类型前和在*之后 ------------const int * const E = &C ;// *E = 1000 ;//错误,间址访问为只读// E = &C ;//错误,不能修改指针常量C = 1000 ;cout << " E = " << *E << endl ;const int * const F = &A ;//F = &C ;// *F = 0 ;cout << "F= " << *F << endl ;//总结 int *const 这样定义的指针不能修改内容,但不能能修改所指的位置 cout << "----------------------------------------" << endl ;
}
15.2常量引用
#include<iostream>
using namespace std ;
int main ()
{
int a=314;
const int & ra=a; //ra是a的常引用
//ra=618; //错误,不能通过常引用对对象a执行写操作
a=618;
}
16表达式
表达式可以分为:算术表达式、逻辑表达式、赋值表达式、条件表达式、逗号表达式
算术运算符 | + - * / (截取整数部分)%(求余数) ++ -- |
关系运算符 | > < == >= <= != |
逻辑运算符 | ! && || |
位运算符 | << >> ~ | ^ & |
赋值运算符 | = 及扩展的复合运算符 |
条件运算符 | ? : |
逗号运算符 | , |
指针运算符 | * & |
求字节运算符 | sizeof |
强制类型转换符 | 类型 |
分量运算符 | . -> |
下标运算符 | [] |
其他 | () :: new delete |
优先级 | 运算符 |
1 | ( ) [ ] -> : : |
2 | ! ~ + - ++ -- & * 类型 sizeof new delete . -> * |
3 | * / % |
4 | + - |
5 | << >> |
6 | < <= >= > |
7 | |
8 | == != |
9 | & |
10 | ^ |
11 | | |
12 | && |
13 | || |
14 | ? : |
15 | = *= /= += -= |= <<= >>= |
16 | , |
16.1自增和自减
自增、自减算符的运算对象只能是整型变量,不能为常量或表达式;
前缀式(先增值后引用 ) x = ++ i 相当于 i = i + 1 ; x = i ;
后缀式(先引用后增值) x = i ++ 相当于 x = i ; i = i + 1 ;
示例
#include<iostream>
using namespace std ;
int main ()
{ int a = 3 ;int b = ++ a ; // 相当于 a = a +1 ; b = a ;//a=4int c = a ++ ; // 相当于 c = a ; a = a + 1; //4=5 b = a -- ; // 相当于 b = a ; a = a - 1 ;//a=4cout << "a=" << a << '\t' << "b=" << b << endl ;c = -- a ; // 相当于 a = a - 1; c = a ;//a=3cout << "a=" << a << '\t' << "c=" << c << endl ;//++ ( a ++ ) ; // 错 (a++)不是变量名c = a + + b; // 错 a++ 无法对 b 操作//a=4cout << "a=" << a << '\t' << "b=" << b << '\t' << "c=" << c<< endl ;c = a ++ + b; // 相当于 c = a + b; a = a + 1;//a=5cout << "a=" << a << '\t' << "b=" << b << '\t' << "c=" << c<< endl ;c = a + + + + b; // (a++) ++b 错cout << "a=" << a << '\t' << "b=" << b << '\t' << "c=" << c<< endl ;
}
16.2类型转换
强制类型转换
int ( x + y ) ( char ) 70 ( double ) ( 2 / 4 )
16.3关系运算符
1.说明数学含义 x在区间[a, b] 的数学表达式 a ≤ x ≤ b, 不能使用 a <= x <= b 表示,应该使用 a <= x && x <= b 表示
2.字符数据按ASCⅡ码值进行比较 'A' > 100 值为 0 (false)
16.4逻辑运算
16.5赋值表达式
1. x = y = z + 2 ;先计算z+2,然后将z+2赋值给y,最后将y赋值给x
2. A = A op B 可以缩写成 A op = B
16.6条件表达式
E1 ? E2 : E3 (E1为真,表达式的值为E2,否则为E3
把字母转换成小写: ch = ( ch > = 'A' && ch < = 'Z') ? ( ch + 32 ) : ch
16.7运算符优先级
单目运算符 |
乘除运算 |
加减运算 |
关系运算 |
逻辑与 |
逻辑或 |
赋值 |
逗号 |
i +1 < j * 4 && ! P || Q 等价于 : ( ( ( i +1 ) < ( j * 4 ) ) && ( ! P ) ) || Q
P != i < j || Q && S 等价于 ( P != ( i < j ) ) || ( Q && S ) 注意逻辑与和逻辑或的优先级
17数据输入与输出
17.1常用的输出格式控制符
控制符 | 功能 |
endl | 输出一个新行符,并清空流 |
ends | 输出一个空格符,并清空流 |
dec | 用十进制表示法输入或输出数值 |
hex | 用十六进制表示法输入或输出数值 |
oct | 用八进制表示法输入或输出数值 |
setfill ( char c ) | 设置填充符c |
setprecision ( int n ) | 设置浮点数输出精度(包括小数点) |
setw ( int n ) | 设置输出宽度 |
示例
#include<iostream>
#include<iomanip> //包含格式输出文件
using namespace std ;
int main()
{ int a,b,s; //说明数据cout.setf(ios::showbase); //要求输出显示基数符a=01137; b=023362; s=a+b; //计算两个八进制数的和cout<<"八进制 ";cout<<oct<<a<<"+"<<b<<"="<<s<<endl;//以八进制显示结果a=239; b=5618; s=a+b; //计算两个十进制数的和cout<<"十进制 "; //以十进制显示结果cout<<dec<<a<<"+"<<b<<"="<<s<<endl;a=0x1a3e; b=0x4bf; s=a+b; //计算两个十六进制数的和cout<<"十六进制 ";cout<<hex<<a<<"+"<<b<<"="<<s<<endl; //十六进制显示结果
}