您的位置:首页 > 移动开发 > Objective-C

20170113C++阶段班03_Object C++_08-09语法复习/Object复习

2017-01-14 00:49 585 查看

Object C 复习:

1:语法部分



1:bool类型!原生C语言里面是没有提供的,作业1:bool,_Bool,BOOL的区别
2:int类型和bool类型可以互相转换。例如:int n = 3; bool b = n; n = b; 最终n为1

3:const:是将变量常量化,属于一个编译器的行为,只是编译器在语法上面对const的变量进行检测,但凡发现里面有人来修改就会报错!把const弄成失效有很多种方式!const_cast就可以!这个仅仅是编译器级别的常量,可以认为const为伪常量,如果在常量区的常量是无法被修改的,属于非编译器级别的,和define定义的属于真常量!const int i = 100;//保存位置视情况而定。const是一个具有类型的常量,相对#define,他是带有类型检测的。const在编译的时候,会分配空间,方便调试,他拥有作用域,宏不拥有作用域,他是全局的!整体上,const相对于宏易于调试,
4:enum:也可以定义常量,不分配空间,直接就是一个常数,是真常量。其实const就是给程序员看的,代表不可以修改这个变量,这就是const语义。学C++一定要弄清楚语义!否则很多地方都会弄不明白。

5:域作用符:1:命名空间。2:域运算符。3:不加前缀代表全局。

6:new/delete:运算符,malloc(函数)不会调用构造函数,new会调用构造函数,new也是运算符,可以被重载。

7:函数重载:返回值不同,不可以构成重载。重载与返回值无关。参数类型不同以及个数或者顺序的不同 可以构成重载。命名改编(name managling)。

8:另外,const版本和普通的是不可以构成重载!const在一个函数结尾的话只能在类里面,const函数只在类里面有用,外部是无法对函数进行const修饰的。一个类的里面如果const在函数前面,也不可以构成重载!因为const在前面只是返回值类型。函数的重载只和参数有关。在类里面,const在函数后面的函数是可以构成重载的!

9:二义性:类型可以被转换或者默认实参都可能造成二义性的问题,二义性就是对函数的调用不明确导致的。

10:引用:别名,作为参数使用的时候,传递的就是本身。返回局部变量的引用的话,出函数后,这个变量就没了。局部变量生命周期只在这个局部内。

11:类型转换:static_cast,const_cast……

12:inline:内联函数,与宏不同,他不一定展开。

2:Object:类与对象



1:类是抽象的,对象是实际存在的!
2:访问权限:public:公有的,private:私有的(外部无法访问),protected:保护的。
3:struct里面也可以用上面三个访问权限限制(仅限C++语言),但一般没使用过。
    在C++里面,struct和class的区别在于默认访问权限。二者都可以来做相同的事情,抽象和封装。C语言有的,C++都有,但是有区别!
    C++的struct也可以拥有成员函数!C语言的不可以!
struct MyStruct//C++下
{
void Foo(){}//默认为公开的!
public:
int num;
char s;
private:
int num1;
char s1;
}MyStruct;


    可以认为class是struct的一个升级版本。
4:vs编译器包含了C和C++编译器。文件后缀决定使用的那个编译器来编译的。

5:默认构造函数是无参的,里面什么都没做。

6:一个类里面,默认生成的函数除了之前的六个之外,取址运算符*的默认函数还有一个const版本的,总共有七个默认的函数。七个函数分别为

    构造函数,析构函数,拷贝构造函数,赋值函数,operator&(),operator*(),operator*()const。

7:重载函数的时候,调用函数直接传入小数,默认匹配到double去,float和int的重载会有二义性!

8:初始化列表:引用,const两种必须使用初始化列表才可以赋值。否则会报错。在初始化列表里面做相当于真正的初始化,与之对应的是计算列,他是先申请变量,然后赋值,初始化列是申请的时候就赋值了!详见博客20161230C++阶段班03_Object
C++03。

9:只需要传递一个参数的构造函数会编程转换构造函数,可以使用explicit禁止转换!如果转换构造函数不止一个,那么就可能要注意一下二义性的问题。

10:默认拷贝构造函数:传入参数是类对象引用,它里面默认做的浅拷贝,他的调用时期是在

    1:传参的时候传的类对象(形参拷贝为实参)。

    2:函数返回的时候,返回的类对象(返回拷贝的)。

    3:申请类对象直接=本类对象的时候(Demo demo = demo1)。

11:运算符重载原则:

    1:单目运算符重载为成员函数

    2:双目运算符重载成友元函数(无论(类+变量)还是(变量+类)都可以调用,demo在前和在后都可以)

    规则:.、=、()、[]、->,五个不可以重载为友元函数。

12:类型转换运算符:

    相当于把类转换为其他类型的数据。

#include <iostream>

class Demo
{
public:
Demo(int num) :num_(num)
{
}
operator int()//类型转换运算符!类->int。const版本的为  operator int() const;
{
return num_;
}
int getNum()
{
return num_;
}
private:
int num_;
};

int main()
{
Demo demo = 100;
int num = demo;//如果为const int num = demo;那么要求类型转换运算也是const版本的!

std::cout << num << std::endl;
return 0;
}


对new的重载有多种版本!
void* operator new(size_t size)
{
Demo = malloc(size);//先申请空间,再调用构造函数,delete是先调用析构函数,再示释放空间
}
void* operator new(size_t size,const void* file){}//这个是使用已有空间的new,不再分配内存空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程