书籍《C++程序设计》

本文详细介绍了C++编程的基础知识,包括C++的输入输出流、常变量、函数原型声明、函数重载、函数模板、变量引用、内置函数、作用域运算符、字符串变量、动态内存分配和撤销、类和对象的特性、运算符重载、继承与派生、多态性与虚函数等核心概念。内容深入浅出,适合C++初学者和进阶者阅读。
摘要由CSDN通过智能技术生成

C++程序设计

作者:清村常争

撰稿时间:2015年11月23日星期一

 

1  C++初步认识

1.1  C++的输入输出流

         cout<< “a=” << setw(6) << a << endl;  // setw()输出所占列数

         inta;  float b;  cin >> a >> b;

1.2  const定义常变量

         const修饰变量、函数,其值不能改变,取代了#define

         const与static,void f()const {…}  //说明f()函数体中的数据不能被改变

         const的成员变量只能在构造函数的参数初始化列表中初始化

1.3  函数原型声明

         函数定义前,先声明函数。

1.4  函数的重载

         建立多个使用相同的函数名,但函数中的参数个数、参数类型或参数顺序必须至少有一种不同的函数,函数返回值的类型无关。用于不同函数,但函数功能相近时。

1.5  函数模板

         建立一个通用函数,其函数类型、形参类型不具体指定,但函数参数个数、函数体必须相同。如:

//定义max函数模板

template < typename T1 , typename T2>

T1 max( T2 a , T2 b)

{

         …

}

//调用

         inta1 = 1, b1 = 2, c1 = 3;

         floata1 = 1.1, b1 = 2.2, c1 = 3.3;

a = max(a1, b1,c1);

b = max(a2, b2,c2);

1.6  有默认参数的函数

         在函数声明时,给函数的参数赋初值,函数定义时不能有默认参数,且不能与函数重载一起使用。如:void f(float a, int b = 0, int c, char d = ‘a’);        

1.7  变量的引用 &

在C++中的引用是给变量起别名,原变量与引用变量使用同一个地址内存,传递方式是地址传递,弥补C语言中只有值形参(形参实参、指针),而无变量形参。使用变量时不带&,只在定义引用时用&。(引用也是一种指针类型)

int a;                                                        voidswap(int &a , int &b);

int &b =a;   //a与b完全相同     swap(i , j);   //i与a、j与b完全相同

const与&引用共同使用,作用函数形参,可以减少数据大小,简化书写。

1.8  内置函数 inline

内联函数(内嵌函数),在x.h文件中的函数声明前加inline,且在x.h文件中定义函数的body,x.cpp没有该函数,系统会自动将inline修饰的函数实体代替程序中的函数调用部分的代码。通常在5个语句以下、频繁调用时使用,不能包括循环等复杂语句。因为函数调用时需要进出堆栈,较耗时。

         优点:节约运行时间;缺点:增加目前程序长度。

1.9  作用域运算符 ::

类后跟的是“::”,而对象后使用“.”,如:B::B ,a.show();

         floata = 13.5;

         intmain()

{

         int a = 5;

         cout << a << endl;  //局部变量a = 5

         cout << ::a << endl;  //全局变量a = 13.5

}

1.10  字符串变量

#include<string>  //strcat()  strcmp()  strcpy()

string str1 =“China”;

1.11  动态分配/撤销内存的运算符new/delete

new动态分配内存。相当于C语言中的malloc函数,float *p =new float(3.141563);

         delete撤销内存。相当于C语言中的free函数,deletep;  delete [] array;

         new+ 类:分配空间,后调用构造函数,返回地址;

         delete+ 类:调用析构函数,后释放空间。

         deleteq与delete q[]区别:student *q = new student[10];使用delete q,只会调用一次析构函数,而后收回所有空间;使用delete q[],会调用十次析构函数,而后收回所有空间。使用了new后必须使用delete,new出来的对象一定是指针类变量,因为返回值是地址。

1.12 概念区别

       变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
       变量声明:用于向程序表明变量的类型和名字。
       定义也是声明,extern声明不是定义

       new: 在堆上分配空间; 在分配的空间上调用对象的构造函数。

       代码区 (code area): 存放程序
       全局(静态)区 (data area): 全局变量、static变量、常量。
       堆区 (heap area): 动态内存分配new/malloc,链表管理方式

       栈区 (stack area): 系统自动分配,空间小,速度快


2  类和对象的特性

面对对象程序设计:对象、封装、抽象、继承、多态。

         类是对象的抽象,对象是类的具体实例;类是对象的模板。

        

class与struct区别:class默认是private,struct默认是public。

         this指针指向本对象。

 

3  类和对象的使用

使用初始化列表初始化类中所有的成员变量,不能再构造函数体中,因为程序更快,且按照声明的顺序进行初始化,初始化列表只能对非静态的成员变量进行初始化,可以在子类的初始化列表中初始化父类继承的成员变量。

         不要使用defaultargument函数参数的默认幅值 void f(int i, int j = 0); //.h中

A a(1,2);  //主函数

A::A(intn, intm) :width(n), length(m){ }  //cpp文件,将1赋值给n,n赋值给width

    A(int n, int m);  //h文件

构造函数:与类名一样的函数,没有返回值,作用是帮组初始化类中的成员变量,当对象被定义(类的对象在内存中创建)时,调用构造函数。

         析构函数:在类名前加“~”的函数,当对象被消灭(定义的类的对象在内存中被收回)时,被调用,不能有参数,

                   {

         A a(2);  //调用构造函数A(int i){…},将2传给构造函数,初始化成员变量。

                            …

}  //调用析构函数

         先构造的对象后析构,后构造的对象先析构:栈

         Why有两个构造函数?函数重载,为同一个函数提供不同功能,构造函数参数是缺省的。Box box1;  //调用默认构造函数  Box box2(); //调用非默认构造函数;声明中有默认参数,定义中也有,以声明为准。

 

static修饰的类的成员变量,在x.h中被声明staticint a;,一定要在x.c中进行定义int A ::a;,其他地方访问时,可用A::a,静态成员变量只能在类体外进行初始化。静态成员变量,指的是在同一类中各对象共享一个static的成员变量A::volume();静态成员函数,只能访问静态成员变量,无this->XX。

 

在本类中用friend声明的全局函数(友元类)、别的类的函数(友元类)、别的类(友元类),这些函数与类可访问本类中的私有变量。

 

类模板:是类的抽象

//定义Compare类模板,虚拟类型名为T1, T2

template < class T1,class T2>

class Compare 

{

         Compare(T1 a, T1 b);

         T2max();

}

//调用

Compare <int,double>  cmp(4, 7);

 

4  运算符重载

函数返回值类型  operator 运算符名称 (形参表)

{ 对运算符的重载处理}

例1:int operator+(int a, int b)

        {return a + b; }

例2:class Complex

        {

            Complexoperator+ (Complex &c2);

}

ComplexComplex::operator+ (Complex &c2)

{ returnComplex(this->real + c2.real, this->imag + c2.imag) }

运算符重载函数在某个类中进行声明为成员函数,且判断运算符是否重载时,看重载运算符的数值是否是运算符重载时需要的类型。

重载运算符规则

(1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行加载;

(2)C++允许重载的运算符;

    除了“.”、“*”、“::”、“sizeof”、“?:”这五个运算符。

(3)重载不能改变运算符运算对象(即操作数)的个数;

(4)重载不能改变运算符的优先级;

(5)重载不能改变运算符的结合律;

(6)重载运算符的函数不能有默认的参数;

(7)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用);

(8)用于类对象的运算符一般必须重载,但运算符“=”和“&am

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值