C++快速入门笔记(一)

C++的概述:

C++的诞生地--贝尔实验室(Bell Lab)

C++之父 比雅尼.斯特劳斯特鲁普

生于丹麦

丹麦奥胡斯大学的数学和计算机科学硕士学位

英国剑桥大学的计算机科学博士学位

德州农工程学院的计算机科学首席教授

《The C ++ Programming Language》

C++发展史三个阶段

第一个阶段从80年底到1995年。这一阶段C++语言基本上市传统类型上的面向对象语言,

并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额。


第二阶段从1995年到2000年。这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,

泛型程序设计在C++中占据越来越多的比重性。当然,同时由于Java,C#等语言的出现和硬件的大规模下降,

C++受到了一定的冲击。


第三阶段从2000年至今。由于以LOKi,MPL等程序库为代表的产生编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,

这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的员。


C++的特性

C语言面向过程

C++面向过程+面向对象(封装、继承、多态)

具备C语言的全部特性,并支持更多新的特性。


C++ I/O方式

#include <iostream>
int main(int argc,const char * argv[]) {
    
    // c语言
    int a =0;
    scanf("%d",&a);
    printf("a = %d",a);
    
    // C++
    char str[20];
    std::cin >> str;
    std::cout <<  str <<std::endl; 

    // 这样的输入,输出方式有哪些便利?
    // 不用关注占位符
    // 不用关注数据类型
    return0;
}

namespace 命名空间

也称“名称空间”、“名字空间”

一种代码组织的形式 通过名称空间来分类,区别不同的代码功能、避免名字冲突。

// 不同的命名空间下允许有相同名称的标识符
namespace A {
    void fun()
    {
        int x =20;
        int y =30;
        std::cout << x + y  <<std::endl;
    }
}
namespace B {
    void fun()
    {
        int x =10;
        int y =90;
        std::cout << x + y  <<std::endl;
    }
}
using namespaceA;// 使用A命名空间
int main(void)
{
    fun();
}


新的数据类型

c语言数据类型

intcharfloatdoublelongdoublestructunionenumNULLvoid、指针类型。

c++

布尔类型(bool)

true  = 1

false = 0

c语言中是没有bool的

要是有需要#include <stdbool.h>

int main(void)
{
    int flag = 1;
    if (flag == 1) {
        // 真
    }else
    {
        // 假
    }
    
    bool flag1 = true;
    if (flag1) {
        // 真
    }else
    {
        // 假
    }

    return 0;
}

C++中的引用

中华人民共和国      中国  别名

C++中的引用就是变量的别名

普通类型引用的定义与使用

int main(void)
{
    int kdskkksdkjdskkdsjkdsjkdsjk = 8;//名字好长
    int &kkk = kdskkksdkjdskkdsjkdsjkdsjk;
    
    kkk = 8888;
    
    std::cout << kdskkksdkjdskkdsjkdsjkdsjk << std::endl; // 输出8888
    kdskkksdkjdskkdsjkdsjkdsjk = 999;
    
    std::cout << kkk << std::endl; // 输出999
    
    return 0;
}
指针类型引用的定义与使用

int main(void)
{
    int x = 10;
    int *p = &x;
    int *&q = p;
    
    std::cout << *p << std::endl;
    *p = 20;
    
    std::cout << *q << std::endl;
    
    int y= 100;
    q = &y;
    
    std::cout << *p<< std::endl;
    
    *q = 30;
    std::cout << *p<< std::endl;
    return 0;
}

引用作为函数参数

void fun(int *a,int*b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}
void fun(int &a,int &b)
{
    int c = a;
    a = b;
    b = c;
}


int main(void)
{
    int a = 100;
    int b = 200;
    fun(a,b);
    std::cout << a<< ":" << b << std::endl;
    int c = 300;
    int d = 400;
    fun(&c,&d);
    std::cout << c<< ":" << d << std::endl;
    return 0;
}
// 输出 200:100 400:300

函数默认值

void fun(int i,int j = 5,int k = 10);
int main(void)
{
    fun(5);
    fun(4,10);
    fun(10,20,30);
    

    return 0;
}
void fun(int i,int j,int k)
{
     std::cout <<i << " "<< j << "  "<< k << std::endl;
}
//    输出
//    5    5  10
//    4   10  10
//    10  20  30

作用域

void fun1()
{
    int x = 0;
    // x 在 fun1 范围内的作用
}

void fun2()
{
    int x = 1;
    // x 在 fun2 范围内的作用
}


函数重载

在同一个作用域下名字相同,参数不同的多个函数(或者同一个命名空间,同一个类下)

1、重载函数的参数个数,参数类型,产生顺序3者中必须至少有一个种不同,返回值不同不作为重载依据。

2、重载函数的功能应该相近,不为重载而重载。

3、main() 函数不能重载

void fun(int *a,int*b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}
void fun(int &a,int &b)
{
    int c = a;
    a = b;
    b = c;
}
void fun(int i,int j,int k)
{
    
}

void fun(int x)
{
    
}
void fun(char x)
{
    
}
void fun(int x,char y)
{
    
}
void fun(char y,int x)
{
    
}

内存管理

1、栈区(stack)由编译器自动分配释放。

2、全局去(静态区)(static)存放全局变量、静态数据、常量。

3、文字常量区 常量字符串就是放在这里的。程序结束后由系统释放。

4、程序代码区  存放函数体的二进制代码。

5、堆区(heap) 程序员申请/释放

申请内存:new

释放内存:delete

int main(void)
{
    int *p = new int;
    if(p == NULL)
    {
        std::cout << "failed" << std::endl;
    }
    int *q = new int(10);
    int *j = new int[5];
    *p = 10;
    j[0] = 1;
    j[2] = 2;
    std::cout << *p <<std::endl;
    std::cout << j[0] << " "<< j[2]<<std::endl;
    delete q;
    delete p;
    delete [] j;
    j = NULL; //释放完毕的后续工作
    
    return 0;
}

当申请内存忘记释放,就会产生内存泄漏。


永久的记忆

输入和输出都是相对于内存来说的

内存的特点:有电则生,断电则亡。

内存 ->输入、输出 ->持久化载体->普通硬盘、固态硬盘、U盘。


文件输出、输出

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, const char * argv[]) {
    // ios::out 为输出而打开文件
    // ios::app 将数据添加到文件的尾部。
    // 文件输出
    ofstream myfile("1.txt",ios::out);
    myfile << "hello C++" << endl;
    myfile.close();
    
    //文件输入
    //ios::in 为输入而打开文件
    char ch[10];
    ifstream file("1.txt",ios::in);
    file >> ch;
    
    myfile.close();
    
    cout << ch << endl;
    return 0;
}

常量 const

不能再赋值是常量

const char ch = 'c';

const:是constant单词的简写,是关键字,可以通过修饰一个变量使其成为常量。

    const int x = 0;
    int const y = 0;
    
    const int *p = 0;
    const int *q = 0;
    
    int *const i = 0;
    const int *const j = 0;
    int const *const h = 0;

const 修饰普通数据类型

const int r = 0;// 后面不能再修改r的值

const 修饰指针类型

    int b = 0;
    int t = 0;
    int  const *d = &b;// 修饰的是指针的值不能改变
    // *d = 3 错误
    b = 3;
    d = &t;//不能改变值、但可以改变指针
    int  *const w = &b;// 修饰的是指针不能改变
    //w = &t 错误
    *w = 10;
const 修饰函数参数

void max(int x,int y);
void max(const int x,const int y);//无法修改常量的值
void max(int const *p,int *const q);//指针p不能改变值、指针q不能指向别的变量

思考:#define与const定义常量的区别

#define 预编译器进行简单的字符串替换

const 编译器进行类型检查






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值