c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)

来源:互联网 发布:asic和单片机 编辑:程序博客网 时间:2024/05/29 03:55
=====================
2016-8-27
=====================
主题:
    1.c++输入输出
    2.namespace 命名空间
    3.引用和函数引用参数
    4.内联函数inline
    5.函数重载,默认参数的函数,函数模板
    6.内存管理



1.c++ 输入输出
=====================
//cin cout 可以自动识别基本数据类型
    cin      //输入
    cout     //输出
    随用随定义以
    bool 数据类型
    
    bool b = 1;  //定义布尔类型
    cout<<boolalpha<<b<<endl;  //以布尔类型输出
    bool x = false;     //假
    bool x = true;      //真

#include<iostream>   //数据输入输出流
#include<stdlib.h>

using namespace std;   //命名空间

int main(void)
{
    int a = 0;
    cout<<"请输入一个整数"<<endl;
    cin>>a;
    cout<<oct<<a<<endl;  //8进制输出
    cout<<dec<<a<<endl;  //10进制输出,不写类型默认输出十进制
    cout<<hex<<a<<endl;  //16进制输出

    cout<<"请输入一个布尔值0或者1"<<endl;
    bool b = 1;  //定义布尔类型
    cin>>b;
    cout<<boolalpha<<b<<endl;  //以布尔类型输出
    
    
    return 0;    
}


-----------------------------------------------------------------------------------------------------------------
2.命名空间: namespace
=============================
:: 作用域运算分解符

-----------------------
#include<iostream>
#include<stdlib.h>

using namespace std;
namespace A
{
    int x = 3;
    void fun()
    {
        cout<<"A"<<endl;    
    }
    
}


namespace B
{
    int x = 10;
    void fun()
    {
        cout<<"B"<<endl;    
    }
    
}

using namespace B;  //不用作用域分解运算符则默认用B空间

int main(void)
{
    cout<<A::x<<endl;  //引用A空间  :: 作用域分解运算符
    cout<<x<<endl;  //使用B空间

    A::fun();
    fun();
    
    return 0;    
}


-------------------------------------------------------------------------------------------------------
3.引用:给变量起别名
============================
c++的函数参数传递:
(1).按值传递
(2).按引用传递,避免复制大量数据的开销,可以提高性能,按值传递如果数据量较大,复制数据将导致较长的执行时间
(3).引用时要赋初值
    int a = 10;
    int &b = a;

&只有在生明引用时是引用操作符,其他时候都是取地址
引用和指针的区别:
    (1).指针是个变量,可以把它再赋值成纸箱别处的地址
    (2).建立引用时必须进行初始化并且决不会再关联其他不同的变量
    (3).有空的指针但是没有空的引用

    数据类型  &引用名(别名)  =   变量;
    指针引用;
    数据类型  *&引用名    =   指针;
    int a = 10;
    int *p = &a;
    int *&q = p;
    *q = 20;     //等价于 *p = 20;

#include<iostream>
#include<stdlib.h>

using namespace std;

struct st
{
    int x;
    int y;
};

void fun(int &j, int &k)
{
    int tmp;
    tmp = j;
    j = k;
    k = tmp;
}

int main(void)
{
    int a = 3;
    int &b = a;  //引用
    b = 5;
    
    int x = 10;
    int *p = &x;
    int *&q = p;  //指针的引用
    *q = 20;
    
    struct st s;
    struct st &d = s;  //结构体的引用
    d.x = 100;
    d.y = 200;

    cout << b << endl << *q <<endl;
    cout<<d.x<<endl<<d.y<<endl;
    
    int i = 20;
    int j = 30;
    cout<<i<<endl<<j<<endl;

    return 0;
    
}


4.inline 内联函数
==================
定义:编译器在看到inline后,为该函数创建一段代码,以便在后面每次碰到该函数的调用都用一段代码来替换,\
以便有更快的调用速度,多次调用的函数

内联函数的声明:
(1).内联函数可以在一开始仅声明一次
(2).内联函数必须在调用之前被声明或定义,因为内联函数的代码必须在被替换之前已经生成被替换的代码
(3).内联函数中不能使用复杂的结构语句


=================
2016-08-29
=================
4.(1).函数重载:
==================
在同一作用域下函数的行参个数或者数据类型不同
    
func(int a, int b); | func(int a); | func(double a, double b);    //函数重载


(2).函数参数默认值:在c++中函数的参数允许有默认值
    func(int i = 1, int j = 2, int k = 3);
默认参数的顺序规定:
    如果一个函数中有多个默认参数,则形参分布中,默认参数应从右向左逐渐定义,当调用函数时只能从左向右匹配参数

(3).函数模板
模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现,方便了大规模的软件开发
泛型编程:独立于任何特定类型的方式编写代码

函数模板的定义形式:
template<类型形式参数表> 返回类型 FunctionName(形式参数表)
{
    //函数定义体    
}

------------------------------
#include <iostream>
using namespace std;

//函数模板
template<typename T>
T abs(T x)
{
    return x<0?-x:x;
}


int main(int argc, char *argv[])
{

    int n = 5;
    double b = -6.6;

    cout<<abs(n)<<endl;
    cout<<abs(b)<<endl;
    return 0;
}


(4).内联函数:
    inline: 建议性的,编译时将函数代码嵌在调用处,省去调用的时间


---------------------------------------------------------------------------------------

5.内存管理:
=================
运算符:new     申请内存
       delete  释放内存,释放后置成 NULL
    

#include<iostream>
#include<stdlib.h>

/* 内存管理运算符:
 *     new      //申请内存
 *    delete   //释放内存
 */

using namespace std;

int main(void)
{
    int i;
    int *p = new int(100);    //申请并赋初值
    if(p == NULL)   //校验是否申请成功
    {
        return 0;     
    }
//    *p = 100;                 //两种赋初值方法
    cout<<*p<<endl;
    delete p;      //用完释放
    p = NULL;

    int *arr = new int[4];    //申请块内存,与数组的使用相同
    for(i = 0;i<4; i++)
    {
        arr[i] = i+10;
        cout<<arr[i]<<endl;    
    }
    delete []arr;   //释放块内存
   arr = NULL;

    return 0;

}
















0 0