类对象作为类成员
#include <iostream>
#include <string>
using namespace std;
//c++类中的成员可以是另一个类的对象,称为对象成员。
class A {
public:
A() { cout << "A side \n"; };
~A() { cout << "Release A \n"; };
};
class B {
public:
A a;//使用A作为对象成员
B() { cout << "B side \n"; };
~B() { cout << "Release B \n"; };
};
//
int main() {
B b;
return 0;
}
静态成员变量
#include <iostream>
#include <string>
using namespace std;
//C++中使用静态成员变量来实现多个对象共享数据的目标,是一种特殊的成员变量。
class Person {
public:
Person(string name, int age, int score) {};
static int cont;//独立占一份内存
private:
string name;
int age;
int score;
};
//成员变量必须在类声明的外部初始化,static 成员变量的内存既不是在声明类时分配,
//也不是在创建对象时分配,而是在(类外)初始化时分配.没有在类外初始化的 static 成员变量不能使用
int Person::cont = 0;
void dofun() {
//通过类访问。
Person::cont = 10;
//通过对象访问。
Person p("sd", 33, 60);
cout << p.cont << endl;
return;
}
int main() {
dofun();
return 0;
}
静态成员函数
#if 0
#include <iostream>
#include <string>
using namespace std;
/*编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,
并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。
而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
*/
/*普通成员函数有 this 指针,可以访问类中的任意成员;
而静态成员函数没有 this 指针,
只能访问静态成员(包括静态成员变量和静态成员函数)*/
/*
所有对象共享同一个函数
只能访问静态成员变量
*/
class Person {
public:
static void getcount() {
age = 22;//静态函数内部能访问
//score = 60;//非静态变量不能被访问,因为静态独占内存。
cout << "Static func" << endl;
}
static int age;//静态变量
int score;//非静态变量
};
int Person::age = 0;
void dofun() {
//1.类访问
Person::getcount();
//2.对象访问
Person p;
p.getcount();
return;
}
int main() {
dofun();
return 0;
}
#endif // 0
成员变量和成员函数分开存储
#if 0
#include <iostream>
using namespace std;
/*
Person p
*/
/*1.
cout << "空类对象占用内存:" << sizeof(p) << endl;
占1字节,C++为区分空间对象位置所以分配一份空间
*/
class Person {
};
/*2.
cout << "空类对象占用内存:" << sizeof(p) << endl;
4字节。int age属于类对象中的数据
*/
class Person2 {
int age;
};
/*3.
cout << "空类对象占用内存:" << sizeof(p) << endl;
4字节。函数成员不属于类对象中的数据。
*/
class Person3 {
int age;
void func() {};
};
void Enter() {
Person p;
}
int main() {
Enter();
return 0;
}
#endif // 0
常函数和常指针
#include <iostream>
using namespace std;
/*如果一个成员函数中没有调用非常量成员函数,
也没有修改成员变量的值,那么将其写成常量成员函数
*/
class Person {
public:
void func() const//1.常函数
{
//age = 10;//常函数内部不能访问this->age。
score = 60;//常变量,只有常函数可以访问
cout << score << endl;
}
int age;
mutable int score; //常变量,只有常函数可以访问
};
int main() {
const Person p1;//常对象只能调用常函数
p1.func();
Person p;
p.func();
return 0;
}
This指针
#if 0
#include <iostream>
using namespace std;
/*this 是一个指针,它指向当前对象,通过它可以访问当前对象的所有成员。
要用->来访问成员变量或成员函数。
理解成python中的self。
*/
class Person {
public:
int age;
Person(int age)
{
this->age = age;//this指向当前类中的age
};
};
int main() {
Person p(18);
cout << p.age << endl;
return 0;
}
#endif // 0