欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > C++速学day2

C++速学day2

2024/11/30 11:47:23 来源:https://blog.csdn.net/weixin_66436813/article/details/141000348  浏览:    关键词:C++速学day2

xia复习

上一天的学习内容:

重点:1、封装———— 就是对类的抽象 ,将一种对象的共性 抽象成一个类。

           2、三个函数——-构造函数/复制构造函数/析构函数

注意:析构函数和构造函数的调用顺序刚好相反。

新内容

两个类的关系

1、     has-a  //

类的组合  ,描述的就是一个类内嵌其他类的对象作为成员的情况,他们之间的关系是一种包含和被包含的关系。

eg: //在线类中内嵌两个点的对象

class Point
{
public:Point(int x=0, int y=0);Point(const Point &other):m_x(other.m_x),m_y(other.m_y){cout<<"&Point" <<endl;}~Point(){cout<<"~Point" <<endl;}void setX(int x);void setY(int y);int getX();int getY();void show();
private:int m_x, m_y;
};Point::Point(int x, int y):m_x(x),m_y(y)
{cout<<"Point(int )" <<endl;
}void Point::setX(int x)
{m_x = x;
}void Point::setY(int y)
{m_y = y;
}void Point::show()
{cout<< m_x<<","<< m_y <<endl;
}int Point::getX()
{return m_x;
}int Point::getY()
{return m_y;
}class Line
{
public:Line(int x1,int y1,int x2,int y2):m_p1(x1,y1),m_p2(x2,y2){cout<< "Line (int int int int )"<< endl;}Line(const Point &p1,const Point &p2):m_p1(p1),m_p2(p2){cout<< "Line (const Point &p1,&p2)"<< endl;}~Line(){cout<< "~Line"<< endl;}void show(){m_p1.show();cout << "->"<< endl;m_p2.show();}
private:Point m_p1,m_p2;
};

2、     is-a  //

类的继承关系。

前向引用声明

class A;
class B
{
public:A *a;void fn(A &a){}
}
class A
{
public:B *b;    
}

若是不在classB之前声明A B中的A对象的定义会报错。

而且这里在类中定义的不能是对象,需要是指针。或者是一个引用的值,不能是对象。

注意:在编程在多文件时注意尽量在源文件中包头文件,不在头文件中包头文件。

UML类图

示例如上

标识符作用域与可见性的问题

C++的比C语言扩展了一些问题:

1、类的作用域

      类内访问,类外访问

2、命名空间作用域

namespace 命名空间

namespace CD
{class Clock{};void foo(){}
}namespace XA
{class Clock{};
}
int main(void)
{CD::Clock c;
}

这个时候创建的c 就是CD 命名空间的c 。

using CD::Clock;    //先声明CD中的Clock 这个函数 后面使用的时候 默认是CD命名空间的
后面使用的时候可以直接写函数或者类;

using namespace CD;
CD中所有的内容都不需要加”::“去访问。

匿名命名空间:

namespace
{class Clock{}
}

这个匿名命名空间的类和操作只能在本文件中使用。
(类似于C语言中全局变量前的static)
 

全局命名空间作用域
全局空间的标识符(函数)在使用时候加上两个::就是全局命名空间作用域的函数

void read()
{::read(fd,p,10);    //这里的read就不是他自己而是全局命名空间作用域的read
}

作用域和作用域之间是可以互相包含的

1、标识符要声明在前,引用灾后
2、在同一作用域中,不能声明同名标识符
3、在没有相互包含关系的不同作用域中同名标识符互不相影响。
4、如果两个或多个具有包含关系的作用域,外层不可见

 

静态 : 生存期与程序运行周期相同 ---->  static  全局变量
动态 : 

static修饰之后 只会被创建一次 不会重复创建 并且结束时间为程序结束的时候。
若是加了static的静态变量 没有初始化 那它默认为  0;

匿名对象可以通过&来进行起别名
const Clock &ref = Clcok(10,20,30);
但此时的ref不能.showtime(); 只能读不能写。


&&ref 右值引用

lvalue  locatable
        如果可以取地址 就是左值
rvalue 
        如果不能取地址 就是右值
        
所有的匿名对象都是右值

右值向左值的转换
 &&i= 10;
 i = 100;
 此时输出就是100;

C++的循环:

int a[] = {1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a) / sizeof(a[0]);for(int x: a)             //base range for 
{cout << x << endl ;    
}

for(int i = 0; i < len ; ++i)
{cout<< a[i] <<endl ; 
}

他们两个输出结果相同。


单例模式:

23种设计模式其中之一  比较简单的  不适用虚函数的
单例模式:
一个类的类对象只能创建一个出来 这个类的对象只能有一个
这就是单例模式。

class SingelTon
{
public:static SingelTon * getIntance(){if(m_p == NULL){m_p = new SingelTon;}return m_p;}static void destroyIntance(){delete m_p;m_p = NULL;}static int getCounter(){return counter;}
private:SingelTon(){counter++;}~SingelTon(){counter--;}static SingelTon *m_p;static int counter;
};SingelTon* SingelTon::m_p = NULL;
int SingelTon::counter;SingelTon *p;p = SingelTon::getIntance();SingelTon *q;cout << SingelTon::getCounter() << endl;q = SingelTon::getIntance();cout << SingelTon::getCounter()<< endl;cout << p << endl;cout << q << endl;SingelTon::destroyIntance();cout << SingelTon::getCounter()<< endl;输出结果:
1
1
0x1c02280
0x1c02280
0

this指针

c1.showtime();
调用类中的函数时 其实函数传入了参数 &c1。
间接传了个参数    这个指针是 this 指针 
   
类的静态成员函数中不存在this指针!

常数据成员 必须进行初始化
常引用之后 必须按照常量 去使用了

const int i 在定义的时候必须要初始化。在类中也要用初始化列表进行初始化const常量

注意:C++中不能通过指针来修改变量

强制类型转换

四个是用来进行强转的关键字。

或者 const_cast <int * >(& i)   //这个就是把 const int* 强转成int *

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com