C++面向对象程序设计(第2版)第一章(C++的初步知识)知识点总结

C++面向对象程序设计

参考书目:《C++面向对象程序设计》—— 谭浩强 《C++程序设计:思想与方法》—— 翁惠玉



一、从C到C++

       C语言是结构化和模块化的语言,C程序的设计者必须细致地设计程序中的每个细节,准确地考虑程序运行时每一时刻发生的事情,当程序规模变大时,结构化程序设计就显得力不从心。
       为了解决软件设计危机,在20世纪80年代提出了面向对象的程序设计思想(OOP)在实践中人们发现C语言使用如此广泛,如果在它的基础上发展一种面向对象的语言,一定会让大众容易接收这种语言,所以产生了C++。
       C++既可以用于面向过程的结构化程序设计,也可用于面向对象的程序设计。

二、C++语言的词法和词法规则

1.C++语言的字符集

       等同于C语言的字符集,包括:

  • 大小写英文字母
  • 数字字符
  • 其他ASCII码字符(除@、$外)

2.单词及词法规则

       单词是构成语句的关键成份之一,通常由若干字符组成,C++有几种单词:

  • 关键字
           是C++语言中的命令字,它是预定义好的单词,C++编译程序对其有专门的解释。如:int、float、if、else、while、switch等等。
  • 标识符
           程序员用标识符对程序中元素实施命名,包括函数名、类名、对象名、类型名、变量名、常变量名、数组名等。标识符以字母或下划线开始,后跟字母、数字、下划线 (标识符区分大小写字母)
  • 运算符
           运算符代表某种操作的单词,由一个或多个字符组成 (注意运算符的优先级和结合顺序)
  • 分隔符
           在语句中关键字和标识符之间、各个语句之间要用分隔符分开。C++常用的分隔符有空格、逗号、分号、冒号、大括号。
  • 注释符
           C++提供了两种注释符。/* 注释* /(多行注释) // 注释(单行注释)

三、最简单的C++程序

1.输出字符

例1:输出一行字符 “This is a C++ program.”

#include <iostream>          //用cout输出时需要用此头文件
using namespace std;        //使用命名空间std
int main()
{
    
    
    cout<<"This is a C++ program.\n";      //用C++的方法输出一行
    return 0;
}

注: (1)C++程序中常用cout、cin进行输出输入,cout是C++定义的输出流对象,<<是插入运算符。 (2)使用cout、cin需要用头文件iostream,在程序开始要用#include声明包含的头文件。 (3) using namespace std; 意思是使用命名空间。C++标准库中的类和函数是在命名空间std中声明的,因此程序中如用C++标准库中的有关内容,就要用using namespace std; 语句声明。 (4)标准C++规定main函数必须声明为int类型,如果程序正常运行,向操作系统返回一个零值,否则返回非零值,通常是-1。

2.数值运算

例2:求a和b两个数之和

#include <iostream>        //预处理命令
using namespace std;      //使用命名空间std
int main()                    //主函数首部
{
    
                                 //函数体开始
    int a,b,sum;              //定义变量
    cin>>a>>b;                //输入语句
    sum=a+b;                  //赋值语句
    cout<<"a+b="<<sum<<endl;      //输出语句
    return 0;                    //如程序正常结束,返回一个零值
}

在这里插入图片描述
注: (1)在程序执行时,键盘输入的第一个数据赋予a,第二个数据赋予b 。 (2)cout语句中的endl是C++控制符常数,作用是让光标换行。

3.数值比较

例3:求两个数中的大数

#include <iostream>
using namespace std;
int main()
{
    
     
    int max(int x,int y) ;         //对max函数作声明
    int a,b,c;
    cin>>a>>b;
    c=max(a,b);                   //调用max函数
    cout<<"max="<<c<<endl;
    return 0;
}
int max(int x,int y)            //定义max函数
{
    
     
    int z;
    if(x>y) z=x;
    else z=y;
    return(z);
}

在这里插入图片描述
注: (1)本程序包含两个函数,主函数main和被调用的函数max。 (2)max函数的作用是将两个整数中的大数赋予变量z。return语句将z的值返回给主函数main。返回值是通过函数名max带回到main函数的调用处。

4.C++类

例4:包含类的C++程序

#include <iostream>                 
using namespace std;
class Student             //声明一个类,类名为Student
{
    
      
   private:                   //以下为类中的私有部分
      int num;                //私有变量num
      int score;             //私有变量score
   public:                   //以下为类中公用部分
   void setdata()           //定义公用函数setdata
    {
    
    cin>>num;              //输入num的值
     cin>>score;}          //输入score的值
   void display()          //定义公用函数display
    {
    
    cout<<"num="<<num<<endl;          //输出num的值
     cout<<"score="<<score<<endl;};   //输出score的值
};                                    //类的声明结束
Student stud1,stud2;      //定义stud1和stud2为Student类的变量,称为对象
int main()               //主函数首部
{
    
    
    stud1.setdata();   //调用对象stud1的setdata函数
    stud2.setdata();   //调用对象stud2的setdata函数
    stud1.display();   //调用对象stud1的display函数
    stud2.display();   //调用对象stud1的display函数
    return 0;
}

在这里插入图片描述
注: (1)程序中声明一个被称为类的类型Student。声明时要用关键字class。C++类中可以包含数据(如变量num、 score)和函数(如setdata函数和 display函数),分别称为数据成员和成员函数。 (2)在C++ 中将一组数据和访问这组数据的函数封装在一起,组成类。一个类是由一组数据,一组对其访问的若干函数,以及数据和函数的访问属性组成的。在前面程序中看到的private(私有)public(公有)保留字代表数据和函数的访问属性。 (3)凡是指定为公有的数据和函数,既可由本类的函数访问和调用,也可由其他函数或语句访问和调用;凡是指定为私有的数据和函数,通常只能由本类的函数访问和调用。 (4)程序中“Student stud1,stud2; ”是一个定义语句,定义两个Student 类型变量stud1和stud2,Student 类与int一样是C++的合法类型。 (5)具有“类”类型的变量称为对象。 Student的对象stud1,stud2具有同样的结构和特征。 (6)在类外调用成员函数时必须在函数名前冠以类的名称。

四、C++对C的扩充

       为了与C兼容, C++保留了C语言中的一些规定,例如头文件的文件名,以C语言里头文件的扩展名是.h,许多C++编译系统保留了这种扩展名,近年推出的C++编译系统新版本,推出了一批不带扩展名的头文件如iostream,string ,cmath 等。为了兼容C++仍允许使用带扩展名的头文件。由于C语言无命名空间,因此使用带扩展名的头文件时不用 using namespace std。
       C++继承了C语言提供的绝大部分功能和语法规定,并在此基础上作了扩充。

1.C++的输入和输出

       C++为了方便使用,除了可以利用printf和scanf函数进行输入和输出外,还增加了标准输入流输出流cin和cout。它们是在头文件iostream中定义的,标准流是不需要打开文件和关闭文件就能直接操作的流式文件,在此标准输入流是指从键盘上输入的数据,标准输出流是指向屏幕输出的数据流。
在这里插入图片描述

  • 用cout进行输出
    格式:cout <<表达式1[<<表达式2……]
    功能:由左向右逐个计算表达式的值,将其插入到输出流cout中。
    使用:cout 必须与输出运算符<<一起使用,每个<<后跟一个表达式,<<运算符的结合方向是从左向右,所以各个表达式的值按从左到右的顺序插入到输出流中。
  • 用cin进行输入
    格式:cin>>变量1 [>>变量2 ……]
    功能:>>是C++的提取运算符,表示从标准输入设备取得数据,赋予其后的变量。
    使用:从键盘输入数值数据时,两个数据之间用空格分隔或用回车分隔。
    在这里插入图片描述

2.用const 定义常变量

       格式:const 类型 变量名 = 常数
       例:const float PI= 3.14159;

3.函数原型声明

       格式:函数类型 函数名(形参表);
       例: int max ( int x , int y );

4.函数的重载

       C++允许在同一个域中用一个函数名定义多个函数,这些函数的参数个数、参数类型不相同。用一个函数名实现不同的功能,就是函数的重载。

例:计算三个数中的最大数(类型重载)

#include <iostream>
using namespace std;
int max(int a,int b,int c)           //求3个整数中的最大者
{
    
     if (b>a) a=b;
if (c>a) a=c;
return a; 
} 
float max(float a,float b, float c)  //求3个实数中的最大者
{
    
    if (b>a) a=b;
 if (c>a) a=c;
 return a; 
} 
long max(long a,long b,long c)  //求3个长整数中的最大者
{
    
    if (b>a) a=b;
 if (c>a) a=c;
 return a;
}
int main( )
{
    
    int a,b,c;  float d,e,f;  long g,h,i;
cin>>a>>b>>c; 
cin>>d>>e>>f;
cin>>g>>h>>i;
int m;
m= max(a,b,c);                        //函数值为整型
cout <<"max_i="<<m<<endl;
float n;
n=max(d,e,f);                          //函数值为实型
cout<<"max_f="<<n<<endl;
long int p;
p=max(g,h,i);                          //函数值为长整型
cout<<"max_l="<<p<<endl;
return 0;
}

在这里插入图片描述

例:计算三个数中的最大数(函数重载)

#include <iostream>
using namespace std;
int max(int a,int b,int c)     //求3个整数中的最大者
{
    
    if (b>a) a=b;
 if (c>a) a=c;
 return a;
}
int max(int a, int b)         //求两个整数中的最大者
{
    
    if (a>b) return a;
 else return b;
}
int main( )
{
    
    int a=7,b=-4,c=9;
 cout<<max(a,b,c)<<endl; //输出3个整数中的最大者
 cout<<max(a,b)<<endl;  //输出两个整数中的最大者
 return 0;
}

在这里插入图片描述
注:不允许函数参数个数、参数类型都相同,只是函数返回值不同。因为系统无法从调用形式上判断调用与哪个函数相匹配。

5.函数模板

       如果两个函数的参数个数相同,函数的行为相同(做同样的事),只是函数和参数的数据类型不同,如果用函数重载的话,编写的函数代码是相同的,为了节省时间,C++提供了函数模板功能。
       格式:template typename 标识符[, typename 标识符, … … ]
       功能:所谓函数模板,是建立一个通用函数,不指定函数类型和参数类型,而用一个虚拟的类型表示。在调用函数时,用实参的类型取代模板中的虚拟类型。

例:为计算两个数中的大数定义函数模板

#include <iostream>
using namespace std;
template <typename T>
T max(T a,T b,T c)  //用虚拟类型T表示类型
{
    
    if(b>a) a=b;
 if(c>a) a=c;
 return a;
}
int main()
{
    
    int i1=8,i2=5,i3=6,i;
 double d1=56.9,d2=90.765,d3=43.1,d;
 long g1=67843,g2=-456,g3=78123,g;
 i=max(i1,i2,i3);
 d=max(d1,d2,d3);
 g=max(g1,g2,g3);
 cout<<"i_max="<<i<<endl;
 cout<<"d_max="<<d<<endl;
cout<<"g_max="<<g<<endl;
 return 0;
}

在这里插入图片描述
注:函数模板只适用于函数参数的个数相同而类型不同,并且函数体相同的情况,如果函数的参数个数不同,则不能用函数模板。

6.有默认参数的函数

       C++允许为函数的参数设置默认值,这时调用函数时,如果没有实参,就以默认值作为实参值。
       格式:形参类型 形参变量名 = 常数
       功能:调用函数时,如果没有实参,就以常数作为该形参的值;如果有实参,仍以实参的值作为该形参的值。

例:编写计算圆柱体体积函数
float volume ( float h, float r = 12.5)

调用可以采用以下任何一种形式:
	volume( 45.6);
	volume( 32.5, 10.5);
	用第一种方式调用时,只有一个实参,圆半径的值取默认值12.5.
	用第二种方式调用时,有两个实参,圆半径的值取实参的值10.5

注: (1)有默认值的形参必须放在形参表的右边,不允许无默认参数值和有默认参数值的形参交错排列。 (2)一个函数名不能同时用于重载函数和带默认形参值的函数。当调用函数时,如少写一个参数,系统无法判断是利用重载函数还是利用带默认参数值的函数,出现二义性。

7.变量的引用

       C++提供了为变量取别名的功能,这就是变量的引用。
       格式:类型 &变量1 = 变量2
       变量2是在此之前已经定义过的变量,且与变量1的类型相同。这里为变量2定义一个别名变量1,在程序里变量1和变量2 就是同一个变量。

#include <iostream>
using namespace std;
int main( )
{
    
    int a=10;
 int &b=a;    //声明b是a的引用
 a=a*a;       //a的值变化了,b的值也应一起变化
 cout<<a<<"  "<<b<<endl;   
 b=b/5;        //b的值变化了,a的值也应一起变化
 cout<<b<<"  "<<a<<endl;
 return 0;
}

在这里插入图片描述
在这里插入图片描述
注:两个变量不能用同一个别名。
       C++除了可以用普通变量、指针变量做形参外,还可以用引用变量做形参。
       (1)用普通变量做形参
       这时传递的是实参的值,在函数内形参与实参是两个不同的内存单元,对形参的修改不会影响实参的值。

#include <iostream>
using namespace std;
void swap(int a,int b)
{
    
     int temp;
 temp=a;
 a=b;
 b=temp;                //  实现a和b的值互换
}
int main( )
{
    
    int i=3,j=5;
 swap(i,j);
 cout<<i<<","<<j<<endl;   //  i和j的值未互换
 return 0;
}

在这里插入图片描述
       (2)用指针变量做形参
       C语言还允许用指针变量做形参,这时传递的是实参变量的地址(指针),在函数内利用这个指针访问实参变量。

#include <iostream>
using namespace std;
void swap(int *p1,int *p2)
{
    
    int temp;
 temp=*p1;
 *p1= *p2;
 *p2=temp;
}
int main( )
{
    
    int i=3,j=5;
 swap(&i,&j);
 cout<<i<<","<<j<<endl;
 return 0;
}

在这里插入图片描述
       (3)用引用变量做形参
       用指针变量做形参,它将实参变量的地址传递给形参,在函数内用“*指针变量”的方式访问实参变量。我们知道引用变量是变量的别名,在调用函数时,用引用变量做的形参就成了实参变量的别名,在函数中用的形参名就是实参的别名,这样比用指针变量更直观、更方便。

#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
    
    int temp;
 temp=a;
 a=b;
 b=temp;
}
int main( )
{
    
    int i=3,j=5;
 swap(i,j);
 cout<<"i="<<i<<"   "<<"j="<<j<<endl;
 return 0;
}

在这里插入图片描述
注: (1)引用变量都具有非void类型 (2)不能建立引用的数组 (3)可以建立常引用变量,不允许修改常引用变量的值

8.内置函数

       C++ 提供了一种机制,在编译时,将所调用的函数的代码嵌入到调用函数代码中,在执行函数时省去了调用环节,提高了函数的执行速度。这种机制称为内置函数,有的书称内联函数。
       格式:inline 函数类型 函数名(形参表)
                  { 函数体 }
       调用格式:函数名(实参表)

例:用内置函数计算平方根

#include <iostream>
using namespace std;
inline int power(int x)       //定义内置函数
{
    
    return x*x;}
int main()
{
    
    cout<<power(2)<<endl;
 cout<<power(1+1)<<endl;
 return 0;
}

注:使用内置函数可以节省程序的运行时间,但增加了目标程序的长度。所以在使用时要衡量时间和空间的得失。

9.作用域运算符

       每个变量都有其有效的作用域,程序只能在变量的有效的作用域内使用变量,不能直接使用其他域中的变量。
在这里插入图片描述

例:局部变量和全局变量同名

#include <iostream>
	using namespace std;
	float a=13.5;
	int main( )
	{
    
        int a=5;
	     cout<<a<<endl;
	     return 0;    }

       程序中有两个变量a,一个是全局变量,另一个是main函数的局部变量,根据局部变量会屏蔽同名的全局变量规则,在函数中出现的变量a是局部变量,因此输出的值是5,而不是13.5,为了在函数中访问全局变量C++提供了作用域运算符 :: ,可以用来指定要访问的作用域,可以把main函数改写成

#include <iostream>
	using namespace std;
	float a=13.5;
	int main( )
	{
    
    int a=5;
	cout<<a<<endl;
	cout<<::a<<endl;
	 return 0;
	}
	::a表示全局变量a。注意不能用::访问局部变量。

10.字符串变量

       C++提供了字符串类类型string,实际上它不是C++的基本类型,它是在C++标准库中声明的一个字符串类,程序可以用它定义对象。

  • 定义字符串变量
    格式:string 变量名表;
    注:如用字符串变量,在程序开始要用包含语句把C++标准库的string头文件包含进来。
  • 进行字符串操作
    (1)对字符串变量赋值
    字符串变量= 字符串表达式
    在这里插入图片描述
    (2)访问字符串中的字符
    C++允许把字符串作为字符数组,第一个字符的下标是0,第二个字符的下标是1,以此类推。
string  w = "then";
 	    w[2] = "a";

       (3)输入输出字符串
       cin >> 字符串变量
       cout << 字符串变量
       (4)字符串连接运算
       格式:字符串1 + 字符串2

string  st1=“C++;
string  st2=“Language”;
st1 = st1 + st2 ;

       (5)字符串比较运算
       可以用关系运算符>、>=、==、!=、<、<=对两个字符串同一位置的字符进行比较,根据ASCII码值判定字符的大小。

”china” > “chinese”
运算结果是假。

11.动态分配/撤销内存的运算符

       格式:new 类型 [ (初值)]
       类型是决定分配空间尺寸的关键元素,如果运算结果正确,它的值是分配内存空间的起始地址,否则返回NULL。
       格式:delete[] 指针变量
       撤销指针变量所指的动态内存空间,指针变量的数据类型决定了空间尺寸的大小。

例:用动态内存存放结构体变量

#include <iostream>
#include <string.h>
using namespace std;
struct student 
{
    
    char name [10];
 int num;
 char sex;
};
int main ( )
{
    
    student *p;
 p=new student;
 strcpy_s(p->name,"Wang Fun");
 p->num=10123;
 p->sex='M';
 cout<<p->name<<"  "<<p->num<<"  "<<p->sex<<endl;
 delete p;
 return 0;
}

在这里插入图片描述

五、C++程序的编写和实现

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43312470/article/details/108045857