您的位置:首页 > 编程语言 > C语言/C++

菜鸟潇寒学习C++的笔记——第一部分

2013-12-21 20:38 295 查看
C++ 学习

1.头文件 iostream。

  扩展名:.cpp .C .cc .cxx都可以,推荐使用.cpp。

  编译用g++,用法和Gcc一样。

  输入输出 cin >>/cout >>。

  名字空间 using namespace std。

  包括C语言文件可以这样的写:stdio.h==》cstdio 。

  注释和C语言一样。

2.名字空间用法

 定义:

    namespace 名字
{

          变量声明,变量定义,函数声明,函数定义.....  

    }

     多个同名的名字空间会合并在一起。

     如果需要也可以在名字空间里面嵌套名字空间。

  namespace A

  {
namespace B
{
char x;

}
double Z;
....
}(这就是嵌套)

  使用: (1)名字空间::内部的名字  例如:A::B::x

               (2)统一指定名字空间  using namesoace A;
                                                              B::x
                                                               z;

  作用:解决名字冲突问题

3.匿名名字空间(全局名字空间)

    全局定义的 int var ; void func();

    可以直接使用名字,也可以加 ::

    var=123;或::var=123

4.输入输出在写程序的时候不用关心类型了。

运行的时候还是要输入正确的输入,如果输入错误,

就不会被取走,输入操作失败。

5.C语言与C++的区别

(1)结构 ,联合 ,枚举  

  定义完后得到的就是一个自定义的类型。

  在C语言中  使用时是这样的struct std{..};
  struct std std1;

  在C++中使用结构枚举联合类型在定义变量的时候,不用再重复struct,union,enum。

     直接 struct std {...};

          std std1;

  C++中结构定义的时候,成员不但可以是数据,还可以是函数和类型。

(2)C语言中使用union XXX{
  int a;
  char b[4];

        };

               union XXX v;
      XXX v;
      x.a,x.b;

     C++中使用   union{
  int x;
 char y[4]

                };
x=0x61626364;

           
y[0]=='d';

(3)枚举类型不再等同于整数类型,如果需要转化可以用强制类型转换。

(4)bool类型在C99里面支持,要头文件<stdbool.h>,C++是自带的,表示

是否,只有true/fase两个值,可以自动转化成整数1/0.其他数据当成

布尔类型时非零真,零则假。

(5)字符字面量:(在C语言里面没有真正的字符字面量,用的实际都是int)

   "*"

(6)void* 类型:
严格限制不能赋值给其他地址类型

(7)C++是一种强制类型语言。

(8)强制类型装换在C的基础上增加了一种形式:类型(数据)。

  C++里面不常用强制类型装换。如果确实要类型装换,C++提供了

  另外四种方式:

    a. static_cast<类型>(数据)用于数值类型之间进行的装换及void*

       XX*类型之间。

    b.reinterpret_cat<类型>(数据)用于数值类型与地址之间或者地址

      类型之间。

    c.const_cast<T常量的类型*>(T常量的地址)去掉对地址所指向的目标的cosnt限制。

    d.dynamic_cast以后再说。

(9)C语言潜规则
a.默认返回值int类型
b.空参数表示参数个数随意

      c.(C++中都是没有的,因此在函数调用前必须声明或者定义)

      d.重载:C++允许多个函数同名,但是要求不同的参数表(不同类型或不同个数或不同顺序..
   必须足以让编译器分清调用哪个。编译器无法区分那个时候自然会产生错误)。

6.形参默认值:如果函数的某个形参在调用时绝大多数情况下都传递的是某个特定实参,那么就可以

把这个实际参数指定为这个形参的默认值,调用的时候可以不再传递。有默认值的形参必须靠右边。

声明和定义分开时,形参默认值放在声明中。

7.哑元:多余的形参,不需要指定名字,一般时为了跟以前的版本兼容,偶尔也会用其他人认为的用途。

8.宏函数:基本不用,意识不符合强类型要求,二是副作用。取代的是内联函数,用inline表示。

在调用的地方展开函数代码不是产生调用,跟红函数一样高效,但却有明确的参数类型而没有副作用。

是否真正的执行inline的要求,晚秋有编译器自己决定。

9.内存管理

C语言里面是:malloc/free/calloc/realloc,返回void*.

C++里面      new 类型       --->    释放            delete 地址

                    new 类型 [元素个数]--->    释放        delete  []  地址 

             new  (指定类型)类型 :在制定地方分配内存(少用),指定初始值直接用一堆空括号的称为零初始化。

              char* p=new char();-->则*p=='\n'。
    new文件失败后会throw抛出异常导致程序终止,可以用nothrow来在

          内存失败时候申请像C一样的放回NULL,头文件<new>。

10.古怪的关键字,用来表示运算符。 and ,or ,not,and_eq,or_eq,xor_eq

   not_eq,bitand,bitor,xor(异或),compl(取反) 

11.古怪的指针:成员指针。
struct Date{
int year;
int month;
int day;
};
int Date::* p = &Date::year;//成员指针的例子
p = &Date::month;
p = &Date::day;

12.C语言中是值传递,C++中还有一种引用传递。 

   引用本质上是指针,编译器自动取地址,加星号。直接使用变量本身,而不是复制数据。

所以修改了引用也就修改了数据本身。

   定义:类型& 名字=初始化;引用必须初始化,用初始化它,

他就和谁是同一个整体,这种关系一生一世不变(函数一生一世就是被调用一次)

  C++中void swap (int& x,int& y)等价于C语言中void swap (int *x ,int *y)

   特别说明: 形参在调用的时候由实参初始化。返回值实在返回时由return后面的数据初始化。

13.字符串:C字符串数组长度问题,末尾的'\n'忘记。

  C++字符串string类型,头文件string支持像字符数组那样下标访问元素,

支持+,=各种运算。不用考虑空间问题。成员函数size()  length()都可以去的字符串长度,

成员函数c_str()可以返回对应的C语言字符串(只读)。

14.数组:C语言的数组长度一旦确定就不变了,作为参数传递就蜕变成地址无法知道的长度

只能再追加一个参数表示长度。

         C++数组用vector<类型>数组名(长度,元素初始化),用法和C语言一样,随时

可以用resize(长度)来调整大小,随时可以用size()来取得元素个数。头文件<vector>

15.头文件<string.h>是C语言字符串处理函数的头文件,在C++中可以照样使用,也可以换成

<cstring>,效果相同,唯一的区别就是后者把前者里面的全部内容都放到namespace std里。

namespace std{
#include<string.h>

}

头文件<string>是C++语言自己的字符串类型头文件,里面是对string类型的定义。

16.指针

指针是用来保存某种类型变量的地址的变量,取地址:&变量;

                                        取某个地址的变量:*地址

地址运算:p+n,p-n,p[i]=i[p]==等价于>*(p+i),*p,p-q.(加减的数n是指针变量类型的n倍)。

指针定义的时候建议初始化,从而避免野指针,不要通过空指针或者释放后的指针找变量,不要

返回非静态局部变量的地址作为返回值。 作为函数形参的指针尽量加const修饰。

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

17.面向对象:Objected-Oriented Programming
C语言是一系列函数描述程序的工作过程,称为面向过程。
C++把程序里面的数据和对数据的操作合起来看作一个实体(称为对象),编程工作就是操作

相互作用来完成程序的功能,这样的编程方式称为面向对象编程。

抽象:每个实体都有很多的数据和行为,只提取咱们关心的数据和行为。

封装:用抽象的结果来描述实体的类型,称为封装。C++中可以用结构体来实现分装。

但是出于跟C语言的兼容,一般在C++中也只封装数据,用class关键字来实现封装,称为类。

封装好的类只是一个类型。

定义类:
class XXX{
成员函数或者成员函数的定义
}

结构体与类的区别:
结构体只是简单的打包,内容对外是透明的,可以通过结构体变量结构体变量名访问

它的任何一个成员。
C++是保密封装,对外是不透明的,不允许通过变量直接访问的成员,除非是故意公开

的(public)。默认是不公开的(private)。

  这种类或者结构类型的变量就称为对象。

  成员函数如果在外面去实现(函数不在类内部),那么函数名应该写成“类名::函数名”。(结构也一样)。

  多文件结构:一个类一般写成一个.h文件和一个.cpp文件。在.h文件中,成员函数只有声明,没有函数体,

在.cpp文件中包含.h文件并且给出那些成员函数的定义(包括函数体)。<实际项目中一定要这样写>。

18. 创建每一个对象的时候会自动的调用一个成员函数,称为 构造函数 。函数名就是类名。

这个函数没有返回类型。构造函数可以重载,一般访问限制是public。

   如果一个类没有构造函数,编译器会自动

产生一个不干事的空函数。只要有构造函数,编译器就不再为这个类产生无参构造函数(默认构造函数,缺省构造函数)

   一个对象创建时如果需要做额外的事情,就可以放在构造函数里面。创建对象的实际步骤:
分配内存-->执行构造函数(如果成员是对象,成员的构造函数会在整体构造函数之前执行。)

 this:调用成员函数时候,编译器总是自动的悄悄的把那个对象的地址作为一个隐含参数传递,

在成员函数内部用关键字this来接受这个隐函参数,。类型为X*const,表示当前对象的地址。

初始化列表
在构造函数定义里紧跟参数之后可以有一个初始化列表,用冒号开头,后面有若干对"成员变量

(初始化)",多对之间用逗号分开。初始化列表是初始化常量成员和引用成员的不二法门。

第三天上午1:22:22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 C++