const与指针类型

来源:互联网 发布:2017年淘宝双12新玩法 编辑:程序博客网 时间:2024/06/06 08:24
const int *p = NULL;int const *p = NULL;//完全等价int * const p = NULL//和上面两种情况不同const int * const p = NULL;int const * const p = NULL;int x = 3;const int *p = &x;//p=&y; 正确//*p = 4; 错误//由于const修饰的是*p,而*p是具体的值而不是地址,所以这里表示*p所指向的值是不可改变的。int x = 3;int *const p = &x;//p = &y;错误的//因为const修饰的是p,p是地址,因此地址p是不可改变的。const int x = 3;const int * const p = &x;//都不能变。const与引用int x = 3;const int &y = x;//x = 10;正确//y = 20;错误,不同通过y修改,但是能通过x修改。对比例子:const int x = 3;int *y = &x;//编译器报错,可变指针不能指向不可变的变量。int x = 3;const int *y = &x;//允许。


宏定义编译器不检查语法错误。


函数特性

函数默认值:

void fun(int i, int j = 5; int k = 10); //正确 func(20);func(20,30);fun(20,30,40);void fun(int i, int j = 5;int k);//错误

有默认参数值的参数必须在参数表的最右端


函数重载

在相同的作用域内

    用同一个函数名定义多个不同的函数

    参数个数和参数类型不同


在编译过程,会这样getMax_int_int;   getMax_double_double

内联函数(关键字inline int getMax(int x, int y)):编译时讲函数体的代码和实参代替函数的调用语句,优点是省去了调用过程,比较快,适合短循环

1:内联编译时建议性的,由编译器决定

2:逻辑简单,调用频繁的函数建议用内联

3:递归函数无法使用内联,即使使用inline关键字,编译器也将他看成普通函数


C++内存管理

本质是资源管理,由操作系统掌控。我们可以做的就是像操作系统申请资源和释放资源


申请内存 new   释放资源 delete   他们是运算符,而不是函数

int *p = new int; //申请单个内存int *p1 = new int[10]; //申请一块内存delete p;delete []p1;


C语言中;void *malloc(size_t size);  void free(void *memblock);

注意会申请失败。用if(p ==NULL)申请失败。


释放内存时,在delete p;后,要设置p=NULL; 否则会有乱七八糟的错误


C++内存分配:

补充在这里。


结构体:

区别:

C 结构体,就是数据的集合,只有成员变量,没有方法。
C++ 结构体和 C++ 类基本一样,可以有成员变量,有方法, 唯一区别就是结构体成员默认访问控制为public,类为private


结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。

1.结构的构造函数和类的构造函数不同。

   a.结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。

   b.结构不能包含以下形式的初始值设定类:base(argument-list);

2.对于结构中的实例字段成员,不能在声明时赋值初始化。

3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。

 

5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。

结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结 构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速 度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。

还有一点:struct 与class本质上应该是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ).之所以要保留struct,很大一部分原因是为了与C兼容吧(C++的一篇文章中是这么说的,我感觉还是有一定的道理). class感觉是应该是struct的扩充,除了可以设置成员的访问类型外,还可以有自己的成员函数,可以继承派生等,好象struct能做的class 都能做,但反过来就不行了,如果没有保护数据的要求,struct能做的我都用struct做,比较简单。


C++ 封装

构造函数,析构函数, this指针

类的定义:数据成员,成员函数

累的访问限定符:public, private, protected


从栈中实例化对象,TV tv; TV tv[20];

从堆中实例化对象, TV *p = new TV(); TV *q = new TV[20];

delete p; delete []q;

在栈中定义好对象后用点 tv.type=0; tv.changeVol();


在堆中定义好对象后用-> : p-type=0; p->changeVol();

p[i]->type = 0;


基本的数据类型:

字符串数组,用的比较频繁

#include<string> string s1;string s2("ABC");string s3(s2);string s4(n,'c);s.empty();s.size();s[n];s1+s2;s1 = s2;v1 == v2;v1 != v2;stirng s6 = "hello" + "world" //错误,只能是变量+变量 或者 变量+“dd”


内类定义:内联函数
class A{    public: void setAge(int m_age){age = m_age;}}

优先将其编译成内联函数。


类外定义:

同文件类外定义,分文件类外定义

同文件类外定义:

class Car{public: void run();};void Car::run(){}


分文件类外定义:

//Car.hclass Car{public:    void run();}

//Car.cppinclude "Car.h"void Car::run(){}

#include<>直接从编译器自带的函数库中寻找文件
#include""是先从自定义的文件中找 ,如果找不到在从函数库中寻找文件

如果是自己写的头文件 建议使用#include“”

类的初始化:

类的数据成员存放在栈或者堆中,而方法只存一份,放在代码区

构造函数:对象创建后自动调用,且只调用一次,

1:自动调用

2:构造函数与类同名

3:没有返回值

4:可以重载

5:实例化对象仅用到一个

6:当用户没有定义构造函数使,编译器自动生成。

1 0
原创粉丝点击