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

20170111C++阶段班03_Object C++_06-07static与类/const与类

2017-01-11 17:29 441 查看
作业讲解:

begin rebegin end rend :从头开始遍历和从尾开始遍历,是windows的一个概念。

at:有下标检测。与下标([])有区别,at永远不会越界,而下标是可能越界的!

自己写类建议加命名空间,cpp实现的时候,建议直接全部包含在命名空间里面。不要using namespace(可能造成命名空间污染)。

全局的数据一般在后面加上_ eg:char* data_;,成员变量现在统一只用这种!

空字符串和空指针是有区别的,空字符串是有地址的,他占用内存空间,空指针就是nullptr,没有实质性的东西。

不以空项目创建工程的话,里面包含了预编译头文件。包含了一些常用的库。

全局变量以及宏定义不要写在.h文件里面。因为其他文件包含这个库的时候可能导致与其他地方的全局变量和宏定义冲突,重定义。

static与类:

static修饰后,相当于一个小的全局变量了,不用反复初始化。作用域只在文件中。

类中,成员变量用了static修饰后,这个就不属于对象了,它属于类了。属于类的成员函数!但可以有对象来调用

//demo.h:-----------------------

#ifndef _DEMO_H_
#define _DEMO_H_
class Demo
{
public:
Demo();
~Demo();
public:
static int num_;//属于类
static int const num1_ = 100;//只有const整形的static可以在里面初始化,其他的必须在外面初始化
int other_;//属于对象
private:
};
#endif//!_DEMO_H_
//demo.cpp:----------------------

#include "Demo.h"

int Demo::num_ = 100;
//定义静态变量的动作,必须在外部初始化(int型的const整形可以在里面初始化,其他的全部必须在外面才可以)
Demo::Demo()
{
}
Demo::~Demo()
{
}
//main.cpp:-------------------------

#include "iostream"
#include "Demo.h"
int main()
{
Demo demo;
demo.num_ = 10;
std::cout << demo.num_ << std::endl;
Demo::num_ = 20;
std::cout << Demo::num_ << std::endl;
return 0;
}


    所有的对象里面都会共有这个num_。相当于这个num_只有一个,每个对象都可以访问并修改!

    如果类是分文件的,一定要在类的外部初始化一次!除了const int可以在.h里面初始化,其他的必须在外面.cpp初始化(int demo::num = 100;)。

    static还可以与成员函数发生作用。这样,这个成员函数就可以直接拿来用了,他不属于对象,而是属于类。也最好不要用对象去调用他(不会出错,但是不符合规范),他是没有对象属性的,static成员函数里面不可以使用this指针,即不可以访问非静态成员,只能访问静态成员。非静态函数可以访问静态成员。静态成员也受类里面的public,private等限制!

    成员变量:1:被对象共享的,但他是不属于对象的。2:类名直接访问。

    成员函数:1:没有this指针(无法访问非静态成员 变量 函数)

    单例模式:把类的构造,拷贝,赋值做成是有的,外面无法申请类对象。并提供一个公开的静态接口返回一个类对象的引用就可以了。

//单例模式!
class Counter
{
public:
static Counter& GetInstance()//这种会有问题,是非线程安全的,不能重入,最好的单例模式是使用内部类或者智能指针来做才好
{
static Counter demo;
return demo;
}
static Counter* GetInstancep()//用指针来做的,
{
if (!demo)
{
demo = new Counter;
}
return demo;
}
static void Free()
{
delete demo;
}
~Counter(){ std::cout << "~Counter()" << std::endl; }
private:
Counter(){ std::cout << "Counter()" << std::endl; }
Counter(const Counter& other){}
Counter& operator=(const Counter& other){}

static Counter *demo;
};
Counter *Counter::demo;//外部初始化

int main()
{
Counter *demo = Counter::GetInstancep();
Counter *demo1 = Counter::GetInstancep();
Counter *demo2 = Counter::GetInstancep();//只调用了一次构造函数
Counter::Free();//释放

Counter& demo3 = Counter::GetInstance();
return 0;
}


const与类:

const的对象只能访问const函数。const的函数和非const的函数可以构成重载!!!!!

类中写const版本和非const版本的时候,一般可以直接用非const版本调用const版本!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程