C++基础

C++命名空间(名字空间):

为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念

#include <stdio.h>
//将类定义在命名空间中
namespace Diy{
    FILE fp = NULL;
    class Student{
    public:
        char *name;
        int age;
        float score;
  
    public:
        void say(){
            printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
        }
    };
}
int main(){
    Diy::Student stu1; 
    stu1.name = "小明";
    stu1.age = 15;
    stu1.score = 92.5f;
    stu1.say();
    return 0;
}

:: 为域解析操作符

C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”。

保留原来的库和头文件,C++ 中可继续使用,再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库,使用了老式 C++ 的程序可继续用原来的库,新开发的程序可以使用新版的 C++ 库。

老式 C++ --> 规范C++

iostream.h-->iostreamfstream.h-->fstream

而对于原来C语言的头文件,采用同样的方法的基础上,每个名字前添加一个c字母

``stdio.h-->cstdiostdlib.h-->cstdlib`

用新的库文件都可用为stdnamespace

在 main() 函数中声明命名空间 std,它的作用范围就位于 main() 函数内部,如果在其他函数中又用到了 std,就需要重新声明

#include <iostream>
void func(){
    //必须重新声明
    using namespace std;
    cout<<"http://c.biancheng.net"<<endl;
}
int main(){
    //声明命名空间std
    using namespace std;
    cout<<"C语言中文网"<<endl;
    func();
    return 0;
}

作用全局范围,放于函数体外部

#include <iostream>
//声明命名空间std
using namespace std;
void func(){}
int main(){
    return 0;
}

C++输入输出

编写 C++ 程序时,需要使用输入输出,则需要包含头文件iostream,它包含了用于输入输出的对象,常见的cin表示标准输入、cout表示标准输出、cerr表示标准错误.

iostream 是 Input Output Stream 的缩写,意思是“输入输出流”

#include<iostream>
using namespace std;
int main(){
    int x;float y;
    cout<<"Please input an int number:"<<endl;
    cin>>x;
    cout<<"The int number is x= "<<x<<endl;
    cout<<"Please input a float number:"<<endl;
    cin>>y;
    cout<<"The float number is y= "<<y<<endl;   
    return 0;
}

cout 进行输出时需要紧跟<<运算符,使用 cin 进行输入时需要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanfprintf 那样给出格式控制字符串.

cout cin 都是 C++ 的内置对象,而不是关键字,在C++ 提前创建好的对象称为内置对象中.

endl 最后一个字符是字母“l”,而非阿拉伯数字“1”,它是“end of line”的缩写

C++布尔类型

C语言中,关系运算和逻辑运算的结果有两种,真和假:0 表示假,非 0 表示真.(没有彻底从语法上支持“真”和“假”)

C++ 新增了 bool 类型(布尔类型),是 C++ 中的关键字(用法和 intcharlong 是一样的),它一般占用 1 个字节长度。bool 类型只有两个取值,truefalsetrue 表示“真”,false 表示“假”.

bool flag = true;

C++ new和delete运算符

C语言中,动态分配内存用 malloc() 函数,释放内存用 free() 函数。(C++中,这两个函数仍可使用) 如下所示:

int *p = (int*) malloc( sizeof(int) * 10 );  //分配10个int型的内存空间
free(p);  //释放内存

C++新增两个关键字,newdelete

new 用来动态分配内存,delete 用来释放内存。

int *p = new int;  //分配1个int型的内存空间
delete p;  //释放内存

分配一组连续的内存以存储数据,用new[]:

int *p = new int[10];  //分配10个int型的内存空间
delete[] p;

new 也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 newdeletenew[]delete[] 操作符应该成对出现,并且不要和C语言中 malloc()free() 一起混用.

C++ inline内联函数

函数调用是有时间和空间开销的, 若函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销不容忽视。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。

#include <iostream>
using namespace std;
//内联函数,交换两个数的值
inline void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    swap(&m, &n);
    cout<<m<<", "<<n<<endl;
    return 0;
}

C++函数重载

参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序, 只要有一个不同就叫做参数列表不同

#include <iostream>
using namespace std;
//交换 int 变量的值
void Swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
//交换 float 变量的值
void Swap(float *a, float *b){
    float temp = *a;
    *a = *b;
    *b = temp;
}
//交换 char 变量的值
void Swap(char *a, char *b){
    char temp = *a;
    *a = *b;
    *b = temp;
}
//交换 bool 变量的值
void Swap(bool *a, bool *b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

函数的重载的规则:

  • 函数名称必须相同。
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
  • 函数的返回类型可以相同也可以不相同。
  • 仅仅返回类型不同不足以成为函数的重载。
posted @ 2019-10-14 20:30  Zachary'  阅读(208)  评论(0编辑  收藏  举报