1.C++对C的扩展

由于没有怎么复习到C++的内容,今天面试被问了好多,都不怎么会答得上来,所以就先放下进程通信那部分,先来复习一下C++。

1.linux环境下的C++。

  第一个C++程序

#include <stdio.h>
#include <iostream>

int main()
{
    printf("hello world\n");//C语言写法
    std::out<<"hello"<<"world"<<std::endl;//C++写法
    return 0;
}

  在linux系统下的C++程序的编译命令:g++ -o hello hello.cpp

  (1)C++文件的后缀:.cpp  .cxx  .cc  .hpp  .h

  (2)C++文件的头文件:标准C++头文件是没有.h的,比如iostream。

    1.如果在C++中要使用到C语言的标准库函数,添加头文件的时候要把.h去掉,并且在前面添加c,比如  stdio.h------>cstdio

    2.也可以在添加头文件的时候指定为C语言

extern “C” { #include <add.h>}

  (3)在C++程序中cin、cout、cerr、clog对象是自动创建(类似于C语言文件stdin,stdout,stderr),用户不能再创建新的istream对象或者ostream对象。

std::cin>>变量           比如:int a; double b; std::cin>>a>>b;
std::cout<<变量/常量     比如:int a=12; double b=10.1;std::cout<<a<<” ”<<b<<std::endl;

2.C++对C的扩展

堆空间的分配

  (1)在C语言中空间的申请和释放  malloc---free  用户自己申请空间和释放

  (2)在C++中空间的申请和释放  new-----delete

申请格式:
数据类型  *p =  new  数据类型
比如:
char *p = new char  在堆空间中申请一个char对象空间(1字节)
char *p = new char(‘a’)  申请一个字节空间并且用a初始化  char*p=(char*)malloc(1)
char *p = new char[100] 在堆空间中申请100个char对象-数组

释放格式:
delete 指针;
比如:
delete p; //只申请一个char对象
delete []p; //释放连续空间(释放100个对象空间)

    C++中的new和delete与C语言中的malloc和free的异同

  (1)都可以申请堆空间,空间是连续的。

  (2)new相当于malloc+构造函数

  (3)delete相当于free+析构函数

命名空间

  作用:避免函数、变量、类型的冲突,合作开发的时候可以避免交叉冲突。

namespace 空间名{
   成员(非main函数, 变量, 常量, 结构体, 类等)
};
namespace class01
{
   string jack;
   string rose;
};
namespace class02
{
   string jack;
   string rose;
};

int main()
{
   class01::jack = “classs01Jack”;
   class02::jack=”class02Jakc”;
}

  空间成员的使用

    1.直接通过空间::成员  来使用

class01::jack = “classs01Jack”;

    2.使用using指示符号指引

using namespace class01;  //把class01空间中的成员全部暴露在全局区域
//string jack=””;
int main()
{
   jack = “classs01Jack”;  //属于class01里面的jack
   class02::jack=”class02Jakc”; //属于class02里面的jack
}

    3.使用using声明成员

using class01::jack;  //把class01空间中的jack在当前文件创建一个副本类似于在当前位置定义string jack;
int main()
{
   jack = “classs01Jack”;  //属于class01里面的jack
   class02::jack=”class02Jakc”; //属于class02里面的jack
}

  命名空间

    1.命名空间嵌套

 namespace AAA
  {
      namespace BBB
      {
          string name;
      }
  }
  //空间嵌套
  //要使用name
  //AAA::BBB::name

  2.同名空间  同名命名空间属于同一个空间,在同一个区域中

//同名命名空间--属于同一个空间(同一个区域中)
namespace CCC 
{
    int number =123;
};

namespace CCC
{
    int data = 321;;
}

  3.匿名空间  空间中的成员要使用的时候必须加空间名,但是匿名空间除外,匿名空间的成员在当前的文件中是可以直接使用的(只能在当前文件中使用)

 namespace {
      int myage;
  }

引用

    应用就是变量或者常量的别名。

int a =10int *p=&a;

    定义:数据类型 &引用=变量

       const 数据类型 &引用=变量/常量

int a = 10int &b = a;  b就是a的引用

    引用的特点:

1 引用不占用内存空间,与引用的对象共用空间
2 引用与引用的对象数据类型必须一致
3 引用定义的时候必须要初始化
4 一个引用只能引用一个对象,一个对象可以被多次引用,引用可以再被引用
5 如果引用的对象是常量那么引用必须用const修饰

   引用作为函数参数

      函数传参的方式:1.传值  2.传地址  3.传引用

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

    const修饰引用

const int a = 100;
const int &b = a;
const int &c = 123;
const 修饰全局变量  const int size =100//存储在只读数据段
const修饰局部变量  const int psize = 200//数据存储在栈空间
int *p = (int*)&psize;  //p所指向的空间是psize符号的副本,*p是可以修饰,但psize本身不能修改
*p= 20;
cout<<*p<<” ”<<psize<<endl;   ==>20, 200;

  C++一般用const修饰的常量来代替宏定义

#define size 100  ==> const int size = 100;

  1. const修饰的常量在使用的时候会检查数据类型,宏定义不会(是直接替换)

  2. const修饰的常量在使用的时候只分配一次空间, 宏定义多次分配空间

  3. const修饰会对数据进行优化

  函数参数是引用的时候用const修饰---让编译器指出错误,如果在函数内部不想让引用的对象值发生改变,那么引用的参数就要加const修饰。

int add(const int &a, const  int &b)  
{
//a++;
return a+b;
}

函数重载

  定义:函数名相同,函数参数列表不同,这一系列函数称为函数重载,重载可以解决函数重名的问题。

int add(const int &a,const int &b){return a+b;}
double add(const double &a, const double &b){return a+b;}

    函数重载-函数调用

    函数重载---在编译的时候会根据函数的实参来匹配对应函数

    静态链编---在编译的时候就已经确定调用的函数(静态链编多态)

  c++为什么能实现函数重载---编译器在编译函数的时候会检测函数名,和参数列表,

  c语言编译器在编译函数的时候只检测函数名,不会检测函数参数

  函数重载依据 : 1, 函数名相同, 2, 参数列表不同,  add(int, double), 3.const修饰的指针或引用也可以作为函数重载依据

函数缺省参数--函数默认参数

#include<iostream>
extern "C"
{
#include <sys/types.h>
#include  <sys/stat.h>
#include <fcntl.h>
}
using namespace std;
int open_lcd(const char *filename="/dev/fb0", int flag=O_RDWR)
{}
int main(void)
{
    int fd = open_lcd ("/dev/fb0", O_RDWR);
    fd = open_lcd ("/dev/fb0");
    fd = open_lcd();
    return 0;
}

  默认参数规则:参数列必须从右往左连续默认

    int show(int a=2, int b=1, int c=0);

    int show(int a, int b, int c=1)

    int show(int a, int b, int c)

PS:有哪里写错的地方,请指正,互相学习。

猜你喜欢

转载自www.cnblogs.com/smallqizhang/p/12459186.html
今日推荐