哈尔滨住房和城乡建设局网站,推荐几个自学做衣服的网站,机票网站建设方式,安平丝网网站建设目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接… 目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 个人主页 C语言 ️️️
C语言例题 python 数据结构C语言 C ️️️
文章链接目录 static成员
概念
声明为static的类成员称为类的静态成员用static修饰的成员变量称之为静态成员变量 用static修饰的成员函数称之为静态成员函数。 静态成员变量一定要在类外进行初始化
静态成员变量
面试题
面试题实现一个类计算程序中创建出了多少个类对象。
class A
{
public:A(){n;}A(const A aa){ n;}
private:static int n;
};
int A::n 0;这里的n就是一个静态全局变量,注意静态变量是不能给缺省值的,因为他不是单独属于某一个对象,而是属于这个类的所有对象,因此需要在类外面定义
由于n受域作用限定符的限制,当我们屏蔽掉private后就可以访问n了
我们再来看看下面的三段代码
补充
代码1
class A
{
public:A(){n;}A(const A aa){ n;}
//private:static int n;
};
int A::n 0;
int main()
{A aa1;A aa2;A* ptr nullptr;cout aa1.n endl;cout aa2.n endl;cout ptr-n endl;return代码2
class A
{
public:A(){n;}A(const A aa){ n;}
//private:static int n;
};
int A::n 0;
int main()
{A aa1;//A aa2;A* ptr nullptr;cout aa1.n endl;//cout aa2.n endl;cout ptr-n endl;return 0;
}代码3
class A
{
public:A(){n;}A(const A aa){ n;}
//private:static int n;
};
int A::n 0;
int main()
{//A aa1;//A aa2;A* ptr nullptr;//cout aa1.n endl;//cout aa2.n endl;cout ptr-n endl;return 0;
}上面的三个代码中ptr输出的n的值是不一样的,这需要我们了解static存储的变量在静态区 比如ptr-n,n并不在ptr指向的对象里,而是在静态区,在寻找n的时候就是去静态区里找 因为是受到static修饰,所以n的值是全局变量,全局变量不想局部变量,出了作用域后就会销毁然后从新开始,也就是说这里的n不会因为一个对象结束后就重新变成0
如何访问private中的成员变量
上面的代码中我们都是将private屏蔽掉才可以访问到n的,当private没有屏蔽的时候,就会因为权限导出不允许访问 要想解决这个问题只有在公有区域里创建一个函数Getn()去获得n的值
class A
{
public:A(){n;}A(const A aa){ n;}int Getn(){return n;}
private:static int n;
};
int A::n 0;
int main()
{A aa1;cout aa1.Getn() endl;return 0;
}静态成员函数
静态成员函数的访问方式如下 A::Getn()也是可以这样访问的,另外静态成员变量也同理
静态成员函数没有this指针
静态成员函数与普通的成员函数不同点在于静态成员函数没有this指针,所以不能访问非静态成员变量或者函数
class A
{
public:A(){n;}A(const A aa){ n;}static int Getn(){a;return n;}
private:static int n;int a;
};
int A::n 0;
int main()
{A aa1;cout A::n endl;return 0;
}特性
1. 静态成员为所有类对象所共享不属于某个具体的对象存放在静态区 2. 静态成员变量必须在类外定义定义时不添加static关键字类中只是声明 3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 4. 静态成员函数没有隐藏的this指针不能访问任何非静态成员 5. 静态成员也是类的成员受public、protected、private 访问限定符的限制
友元
友元提供了一种突破封装的方式有时提供了便利。但是友元会增加耦合度破坏了封装所以 友元不宜多用。所以友元我们了解一下就行了 友元分为友元函数和友元类
友元函数
问题 现在尝试去重载operator然后发现没办法将operator重载成成员函数 因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。 但是实际使用中cout需要是第一个形参对象才能正常使用 所以要将operator重载成全局函数。但又会导致类外没办法访问成员此时就需要友元来解决。operator同理。
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}// d1 cout; - d1.operator(d1, cout); 不符合常规调用// 因为成员函数第一个参数一定是隐藏的this所以d1必须放在的左侧ostream operator(ostream _cout){_cout _year - _month - _day endl;return _cout;}
private:int _year;int _month;int _day;
};友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在 类的内部声明声明时需要加friend关键字。
class Date
{friend ostream operator(ostream _cout, const Date d);friend istream operator(istream _cin, Date d);
public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
ostream operator(ostream _cout, const Date d)
{_cout d._year - d._month - d._day;return _cout;
}
istream operator(istream _cin, Date d)
{_cin d._year;_cin d._month;_cin d._day;return _cin;
}
int main()
{Date d;cin d;cout d endl;return 0;
}说明: 友元函数可访问类的私有和保护成员但不是类的成员函数 友元函数不能用const修饰(没有this指针) 友元函数可以在类定义的任何地方声明不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同
友元类
友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。 友元关系是单向的不具有交换性。 比如上述Time类和Date类在Time类中声明Date类为其友元类那么可以在Date类中直接 访问Time类的私有成员变量但想在Time类中访问Date类中私有的成员变量则不行。 友元关系不能传递 如果C是B的友元 B是A的友元则不能说明C时A的友元。友元关系不能继承
class Time
{friend class Date; // 声明日期类为时间类的友元类则在日期类中就直接访问Time类
中的私有成员变量
public:Time(int hour 0, int minute 0, int second 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour hour;_t._minute minute;_t._second second;}private:int _year;int _month;int _day;Time _t;
};内部类
概念如果一个类定义在另一个类的内部这个内部类就叫做内部类。内部类是一个独立的类 它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越 的访问权限。 注意内部类就是外部类的友元类内部类可以通过外部类的对象参数来访问外部类中的所有成员 但是外部类不是内部类的友元。 特性 1. sizeof(外部类)外部类和内部类没有任何关系。 2. 内部类可以定义在外部类的public、protected、private都是可以的,且内部类受类域限制 3. 注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名(内部类是外部类的友元类)
特性1
class A
{
private:static int k;int h;
public:class B // B天生就是A的友元{public:void foo(const A a){cout k endl;cout a.h endl;}};
};
int A::k 1;
int main()
{A::B b;b.foo(A());cout sizeof(A) endl;return 0;
}sizeof(A)的结果是4,可能很多人会觉得B在A里面的,所以sizeof(A)的结果是包含了B的空间的,但是事实上不是这样的,如果要让sizeof(A)的结果是算上B的空间大小的话应该像下面这段代码这样写
class B
{
private:int _b1;
};
class A
{
private:static int k;int h;B _b;
}此外类是不占用空间的,因为类只是一个声明,而在定义的时候才会有空间,也就是说声明只是说有这么一个东西,但是不会讲空间分配给他,而定义则是让这个东西真实的存在,并分配空间给他
特性2
内部类也是受访问限定符和类域的限制
class A
{
public:class B{};
};
int main()
{A a;B b;return 0;
}当我们用域作用限定符的时候就可以正常运行
class A
{
public:class B{};
};
int main()
{A a;A::B b;return 0;
}但是当class B 在A的private中就会因为B是私有导致无法访问
class A
{
private:class B{};
};
int main()
{A a;A::B b;return 0;
}匿名对象
匿名对象就是没有名字的对象,他的特点是生命周期只在当前一行
class A
{
public:A(int a 0):_a(a){cout A(int a) a endl;}~A(){cout ~A() endl;}
private:int _a;
};
int main()
{A aa1;A aa2(2);A();A(3);return 0;
}拷贝对象时的一些编译器优化
在传参和传返回值的过程中一般编译器会做一些优化减少对象的拷贝这个在一些场景下还 是非常有用的。 但是不同的编译器优化程度是不同的,所以我们只需要简单了解一下就可以了
class A
{
public:A(int a 0):_a(a){cout A(int a) endl;}A(const A aa):_a(aa._a){cout A(const A aa) endl;}A operator(const A aa){cout A operator(const A aa) endl;if (this ! aa){_a aa._a;}return *this;}~A(){cout ~A() endl;}
private:int _a;
};
void f1(A aa)
{}
A f2()
{A aa;return aa;
}
int main()
{// 传值传参A aa1;f1(aa1);cout endl;// 传值返回f2();cout endl;// 隐式类型连续构造拷贝构造-优化为直接构造f1(1);// 一个表达式中连续构造拷贝构造-优化为一个构造f1(A(2));cout endl;// 一个表达式中连续拷贝构造拷贝构造-优化一个拷贝构造A aa2 f2();cout endl;// 一个表达式中连续拷贝构造赋值重载-无法优化aa1 f2();cout endl;return 0;
}
文章转载自: http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.rdsst.cn.gov.cn.rdsst.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.phxdc.cn.gov.cn.phxdc.cn http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn http://www.morning.fgxnb.cn.gov.cn.fgxnb.cn http://www.morning.rxfjg.cn.gov.cn.rxfjg.cn http://www.morning.nkiqixr.cn.gov.cn.nkiqixr.cn http://www.morning.nytpt.cn.gov.cn.nytpt.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.qnxzx.cn.gov.cn.qnxzx.cn http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.uycvv.cn.gov.cn.uycvv.cn http://www.morning.tkryt.cn.gov.cn.tkryt.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.skfkx.cn.gov.cn.skfkx.cn http://www.morning.srbbh.cn.gov.cn.srbbh.cn http://www.morning.hnpkr.cn.gov.cn.hnpkr.cn http://www.morning.ghfrb.cn.gov.cn.ghfrb.cn http://www.morning.cthrb.cn.gov.cn.cthrb.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.zmzdx.cn.gov.cn.zmzdx.cn http://www.morning.fnmgr.cn.gov.cn.fnmgr.cn http://www.morning.sfrw.cn.gov.cn.sfrw.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.cczrw.cn.gov.cn.cczrw.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.qllcp.cn.gov.cn.qllcp.cn http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.hwljx.cn.gov.cn.hwljx.cn http://www.morning.baohum.com.gov.cn.baohum.com http://www.morning.jfmyt.cn.gov.cn.jfmyt.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.bxqtq.cn.gov.cn.bxqtq.cn http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn http://www.morning.xtrnx.cn.gov.cn.xtrnx.cn http://www.morning.nsncq.cn.gov.cn.nsncq.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.pmjw.cn.gov.cn.pmjw.cn http://www.morning.qyhcg.cn.gov.cn.qyhcg.cn http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn http://www.morning.txlnd.cn.gov.cn.txlnd.cn http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.yfrlk.cn.gov.cn.yfrlk.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn http://www.morning.dqwkm.cn.gov.cn.dqwkm.cn http://www.morning.bxgpy.cn.gov.cn.bxgpy.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn http://www.morning.rdbj.cn.gov.cn.rdbj.cn http://www.morning.stflb.cn.gov.cn.stflb.cn http://www.morning.xxiobql.cn.gov.cn.xxiobql.cn http://www.morning.hdrrk.cn.gov.cn.hdrrk.cn http://www.morning.qkqhr.cn.gov.cn.qkqhr.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.cgthq.cn.gov.cn.cgthq.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.rrhfy.cn.gov.cn.rrhfy.cn http://www.morning.demoux.com.gov.cn.demoux.com http://www.morning.bybhj.cn.gov.cn.bybhj.cn http://www.morning.qpxrr.cn.gov.cn.qpxrr.cn http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn http://www.morning.pfnwt.cn.gov.cn.pfnwt.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com