C++特殊成员
提示:以下是本篇文章正文内容,下面案例可供参考
一、const成员
1.const数据成
- const类型变量是不可以修改的
- 必须采用初始化参数列表方式进行初始化
#include <iostream>
#include <string>
using namespace std;
class Stu
{
public:
Stu(string name, int num) :num(num)
{
Stu::name = name;
}
void print()
{
cout << name << " " << num << endl;
}
protected:
string name;
const int num;
};
int main()
{
Stu lisi("lisi", 18);
lisi.print();
while (1);
return 0;
}
运行结果:
2.const成员函数
- 写法上,const写在函数后面
- 常成员函数是不能够修改数据成员,制度数据成员
- 常曾元函数可以与普通函数同时存在
普通函数和常成员函数相同时,普通对象优先调用普通函数 普通对象可以调用常成员函数
3.const对象:const修饰的对象
#include <iostream>
#include <string>
using namespace std;
class Stu
{
public:
Stu(string name, int num) :num(num)
{
Stu::name = name;
}
void printData()
{
cout << name << "\t" << num << endl;
}
void print()
{
cout << name << " " << num << endl;
}
void print()const
{
cout << name << "\t" << num<<endl;
cout << "常成员函数" << endl;
}
protected:
string name;
const int num;
};
int main()
{
Stu lisi("lisi", 18);
lisi.print();
const Stu zhangsan("常对象",20);
zhangsan.print();
while (1);
return 0;
}
运行结果:
二、static成员
**static成员它是不属于对象,是属于类的,意味着是所有对象共有的,调用可以不需要对象,
当然你可以用对象调用,static成员依旧受权限限定。**
1.static数据成员
- 必须在类外初始化,类外初始化不再需要static修饰,但是需要类名限定
- 类中初始化是错误的,不能采用初始化参数列表方式初始化
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
STU(string name, int num) :name(name)
{
}
protected:
string name;
public:
static int num;
};
int STU::num = 100;
int main()
{
cout << STU::num << endl;
while (1);
return 0;
}
运行结果:
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
STU(string name="") :name(name)
{
num++;
}
protected:
string name;
public:
static int num;
};
int STU::num = 1;
int main()
{
cout << STU::num << endl;
STU lisi("lisi");
cout << lisi.num << endl;
STU array[3];
STU* p = new STU("newSTU");
cout << STU::num << endl;
cout << p->num << endl;
cout << lisi.num << endl;
delete p;
p = nullptr;
while (1);
return 0;
}
运行结果:
2.static成员函数
- static写在函数前面即可
- 调用非静态成员,必须要指定对象
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
STU(string name="") :name(name)
{
num++;
}
static void printSTU();
static void pirntData(STU& lisi)
{
cout << lisi.name << "\t" << lisi.num << endl;
}
protected:
string name;
public:
static int num;
};
int STU::num = 1;
void STU::printSTU()
{
cout << num << endl;
cout << "静态成员函数" << endl;
}
int main()
{
cout << STU::num << endl;
STU lisi("lisi");
cout << lisi.num << endl;
STU array[3];
STU* p = new STU("newSTU");
cout << STU::num << endl;
cout << p->num << endl;
cout << lisi.num << endl;
delete p;
p = nullptr;
STU::printSTU();
lisi.pirntData(lisi);
while (1);
return 0;
}
3.static对象
三、友元
友元?用friend描述的关系。友元只是提供一个场所,赋予对象具有打破类权限限定(无视权限)
1.友元函数
#include <iostream>
#include <string>
using namespace std;
void printData();
class STU
{
public:
STU(string name, int age) :name(name), age(age)
{
}
friend void printData()
{
STU lisi("lisi", 29);
cout << lisi.name << "\t" << lisi.age << endl;
}
void print()
{
cout << name << "\t" << age << endl;
}
string name;
protected:
int age;
friend void printData2(STU& lisi);
};
void printData2(STU& lisi)
{
cout << lisi.name <<"\t"<< lisi.age << endl;
}
int main()
{
STU lisi("lisi", 19);
lisi.print();
printData2(lisi);
printData();
while (1);
return 0;
}
运行结果:
#include <iostream>
#include <string>
using namespace std;
class B
{
public:
void printA();
void printData();
protected:
};
class A
{
public:
friend void B::printA();
protected:
string name = "A";
};
void B::printA()
{
A a;
cout << a.name << endl;
}
int main()
{
B b;
b.printA();
while (1);
return 0;
}
运行结果:
2.友元类
#include <iostream>
#include <string>
using namespace std;
class STU
{
friend class STUD;
public:
STU(string name, int age) :name(name), age(age)
{}
protected:
string name;
int age;
};
class STUD
{
public:
void print()
{
STU lisi("lisi", 18);
cout << lisi.name << "\t" << lisi.age<<endl;
}
void printSTUD(STU& lisi)
{
cout << lisi.name << "\t" << lisi.age << endl;
}
protected:
};
int main()
{
STU lisi("lisi", 18);
STUD zhangsan;
zhangsan.print();
zhangsan.printSTUD(lisi);
while (1);
return 0;
}
运行结果:
4、this指针与explicit
explicit
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
explicit STU(int age) :age(age)
{
}
void print()
{
cout << age << endl;
}
protected:
int age;
};
int main()
{
STU temp(12);
temp.print();
while (1);
return 0;
}
运行结果:
2.this指针
- 避免形参名和数据成员同名,通指对象的地址
- 充当函数返回值,返回对象自身,用*this表示对象本身
- 静态成员函数中是不能使用this指针的
#include <iostream>
#include <string>
using namespace std;
class STU
{
public:
STU(string name, int age) :name(name), age(age){}
void initprintData(string name,int age)
{
STU::name = name;
this->age = age;
}
void print()
{
cout << name << "\t" << age << endl;
}
void printThis()
{
cout << this << endl;
}
STU returnSTU()
{
return *this;
}
protected:
string name;
int age;
};
int main()
{
STU lisi("李四", 18);
lisi.print();
lisi.initprintData("张三", 18);
lisi.print();
cout << &lisi << endl;
lisi.printThis();
STU wangwu("王五", 18);
cout << &wangwu << endl;
wangwu.printThis();
lisi.returnSTU().returnSTU().returnSTU().print();
while (1);
return 0;
}
运行结果:
|