课程准备-从C到C++

课程准备-从C到C++

内容提要

  • 数据的输入输出
  • 变量的初始化及常变量(常变量与C相似)
  • 引用及函数间参数的引用传递
  • 命名空间
  • 动态内存分配

数据的输入和输出

由于C++是C with calss,C++对C的完全兼容使得我们在同一个文件中对比这两种语言成为可能

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // C
    int x;
    scanf("%d", &x);
    printf("%d\n", x);

    //C++
    int y;
    cin >> y;
    cout << y << endl; 
}

变量初始化

C++提供面向对象的初始化方法

int x = 10;
int y(10);

引用及函数间参数的引用传递

1.引用

C++允许给变量取一个别名(引用),引用是需要加上引用说明符&并且给出要引用的对象如下的xa

int x(10);
int &xa = x;
cout << xa << endl; 

但是注意,计算机不会给xa再分配空间,xa和x共用同一个内存空间,访问xa就是访问x

2.函数间引用参数的传递

下面代码中,函数swap交换了形参a、b的值,也就实际上交换了实参x、y的值

void swap(int &a, int &b){
    int t;
    t = a; a = b; b = t;
}

int main()
{
    int x(10);
    int y(20);
    swap(x, y);
    cout << x<<endl<<y;
}

引用传递的特点
引用传递将背调函数的形参定义成主调函数中实参变量函数的引用,被调函数通过该引用间接访问主调函数中的变量
被调函数修改的形参实际上修改的是对应的实参。换句话说,被调函数可以通过该引用修改实参的值,将出具传回主调函数引用传递是一种双向数据传递机制
引用传递时,*实参必须是变量
好处是,1.不需要分配内存;2.通过引用实现双向数据传递

几种特殊形式的函数

1.带默认形参的函数

这个部分跟Python中的缺省值一样,如下面这个例子

double Exchange(double amount, double rate = 6.1104){
    return amount/rate;
}

int main()
{
    cout << Exchange(500)<<endl;
    cout << Exchange(500, 6.1104)<<endl;
    cout << Exchange(500, 7)<<endl;
}

输出

81.8277
81.8277
71.4286

带默认形参函数的语法细则
- 带默认值的形参。其他不带默认值的需要给出实参
- 在函数原型中指定默认值,声明中指定了默认值,就不能再声明。同一作用域中只能指定一次默认值
- 同一函数在不同作用于中可以指定不同的默认值(根据局部优先原则)
- 带默认值的形参必须定义在形参列表的后面

C++中,如果两个函数的形参个数不同,可以重名,就称为重载函数:C++编译器自动调用形参实参匹配的函数
用处是方便记忆

内联函数,函数定义的函数头前加inline,用来减少函数间跳转,以提升效率。而且需要保证内联函数的足够简单(如果有循环可能不能保证以内联函数的形式编译),所以一般内联函数是多次调用的简单函数

命名空间

如下定义了一个命名空间

namespace Tom
{
    int x,y;
    void fun(){...}         
}

访问命名空间中的函数和全局变量

1.直接访问

Tom::x = 10;
Tom::fun1()

2.单独声明各标识符的命名空间

using Tom::x;
x = 10l

3.先统一声明命名空间中的所有标识符

引入Tom命名空间中的所有全局变量和函数

using namespace Tom;
x = 10;
fun();

此外C++还有匿名函数空间,如果定义时没有定义命名空间,则输入该空间

引入头文件外还要引入命名空间

动态分配

  • 分配内存:new运算符
  • 释放内存:delete运算符

静态

int x;
x = 10;
cout<<x;

C++动态内存分配

单个变量
1.指针变量名 = new数据类型(初始值)
2.delete指针变量名

int *p;
p = new int;

*p = 10;
cout<<*p;
delete p;

或者更简单的表达

int *p = new int(10)

一维数组
指针变量名 = new数据类型[整数表达式];
delet[]指针变量名
中括号指是一个数组,释放空间要一起释放;例如

int *p = new int (5);
*(p+1) = 10;
p[1] = 10;
cout<< *(p+1);
delete []p

下面这个例程生成斐波拉契数列

#include <iostream>
using namespace std;

int main()
{
    long* p = new long(30);
    p[0] = p[1] = 1;
    for(int i = 2; i<30; i++){
        p[i] = p[i-1]+p[i-2];
    }
    for(int i=0; i<30; i++)
        cout << p[i]<<" ";
    delete []p;
}

至此,已经做好了学习C++的准备

面向对象程序设计方法

程序一般包括四项功能
- 定义保存数据的变量
- 输入原始数据
- 处理数据
- 输出处理结果

怎么从结构化程序设计演化到面向对象程序设计

  1. 程序员乙提供函数,甲调用函数
  2. 程序员乙提供结构体类型(包含变量)(重用数据代码)
  3. 程序员乙提供类和对象(数据成员和函数成员):包含类实现和类分类两个部分
(2.h 数据代码)
class Rectangle
{
Public:
    int a;
    int b;
    int Area();
    int len();
}

(2.cpp,算法代码)
int Rectangle::Area()
{ return::Area();}

int Rectangle::len()
{ return(2*(a+b));}

结构化程序设计中,函数是重用算法代码的基本语法形式

  • 代码提供者
  • 代码使用者

程序设计方法:

  • 结构化程序设计方法
    • 数据跟算法是分离的(数据代码和算法代码,原型声明代码都需要修改)
  • 面向对象程序设计方法
    • 数据类
    • 变量和函数集中在一起,修改时只要修改与数据类的定义代码即可
    • 一个类通常由一位或少数几位程序员编写,牵扯程序员少

封装
输入输出也封装在类中(cin和cout)
将不需要被外界直接访问的成员封装起来

  • 开放
  • 隐藏

访问权限

  • 公有权限 pubilc
  • 私有权限 private
  • 保护权限 protected

公有成员是封装后类对外的接口
一个类必须有公有成员,否则这个类无法使用
访问权限要合理设定

private
public

面向对象程序设计引入了分类(抽象)、封装、继承和多态的思想

大功告成


学习经历:
楼主之前一直想学C++,而且下学期有OOP的课,就准备趁寒假自学下。博主有C语言和比较好的DataStructure的基础,而且又接触过面向对象的Python语言(虽然对其中的面向对象部分使用较少)。所以觉得C++应该可以在比较短的时间内入门。资料主要是参考中国大学MOOC平台上中国农业大学的C++语言程序设计(下)

猜你喜欢

转载自blog.csdn.net/yfren1123/article/details/79234923
今日推荐