类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)

简介: 类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜(上)

//C++程序到C程序的翻译

class CCar {
public:
int price;
void SetPrice(int p);
};
void CCar::SetPrice(int p) 
{ price = p; }
int main()
{
CCar car;
car.SetPrice(20000);
return 0;
}
struct CCar { 
int price; 
};
void SetPrice(struct CCar * this,
int p)
{ this->price = p; }
int main() {
struct CCar car;
SetPrice( & car, 
20000);
return 0;
}

this指针作用

其作用就是指向成员函数所作用的对象

非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。

class Complex {
public:
double real, imag;
void Print() { cout << real << "," << imag ; }
Complex(double r,double i):real(r),imag(i) 
{ }
Complex AddOne() {
this->real ++; //等价于 real ++;
this->Print(); //等价于 Print
return * this;
} 
}; 
int main() {
Complex c1(1,1),c2(0,0);
c2 = c1.AddOne();
return 0;
} //输出 2,1
class A
{ 
int i;
public: 
void Hello() { cout << i << "hello" << endl; } 
};  void Hello(A * this ) { cout << this->i << "hello" 
<< endl; } 
//this若为NULL,则出错!!
int main() 
{ 
A * p = NULL;
p->Hello();  Hello(p);
} // 输出:hello

在C++中,this指针是一个特殊的指针,它指向当前对象的地址。它可以在类的成员函数中使用,用于访问调用该函数的对象的成员变量和成员函数。

当类的成员函数被调用时,编译器会隐式地传递一个this指针作为参数给该函数,以便让函数知道它是哪个对象的成员函数被调用了。通过this指针,我们可以在成员函数中访问对象的成员变量和其他成员函数。

举个例子,假设有一个名为"Person"的类,其中有一个成员变量name和一个成员函数printName(),那么在printName()函数中,可以使用this指针来访问name成员变量,如下所示:

class Person {
private:
    std::string name;
public:
    void setName(std::string n) {
        this->name = n;
    }
    void printName() {
        std::cout << "My name is: " << this->name << std::endl;
    }
};

在上面的例子中,this->name表示当前对象的name成员变量,this->name = n表示将传入的n赋值给当前对象的name成员变量。

需要注意的是,this指针只能在非静态成员函数中使用。静态成员函数没有this指针,因为它们不属于任何具体的对象。

总结一下,this指针在C++中用于访问当前对象的成员变量和成员函数,它是一个隐含传递给成员函数的指针。通过this指针,可以方便地操作和使用对象的成员。

在C++中,this指针是一个特殊的指针,它指向当前对象的地址。它可以在类的成员函数中使用,用于访问调用该函数的对象的成员变量和成员函数。

当类的成员函数被调用时,编译器会隐式地传递一个this指针作为参数给该函数,以便让函数知道它是哪个对象的成员函数被调用了。通过this指针,我们可以在成员函数中访问对象的成员变量和其他成员函数。

举个例子,假设有一个名为"Person"的类,其中有一个成员变量name和一个成员函数printName(),那么在printName()函数中,可以使用this指针来访问name成员变量,如下所示:

class Person {
private:
    std::string name;
public:
    void setName(std::string n) {
        this->name = n;
    }
    void printName() {
        std::cout << "My name is: " << this->name << std::endl;
    }
};

在上面的例子中,this->name表示当前对象的name成员变量,this->name = n表示将传入的n赋值给当前对象的name成员变量。

需要注意的是,this指针只能在非静态成员函数中使用。静态成员函数没有this指针,因为它们不属于任何具体的对象。

当涉及到多个对象之间的交互时,this指针也非常有用。通过使用this指针,我们可以将一个对象作为参数传递给另一个对象的成员函数,从而实现对象之间的通信。

举个例子,假设我们有两个类:Student和Teacher。在Teacher类中,我们定义了一个成员函数addStudent(),用于向Teacher对象中添加一个Student对象。代码如下所示:

class Student {
private:
    std::string name;
public:
    Student(std::string n) : name(n) {}
    std::string getName() {
        return name;
    }
};
class Teacher {
private:
    std::vector<Student> students;
public:
    void addStudent(Student& student) {
        students.push_back(student);
        std::cout << "Added student: " << student.getName() << std::endl;
    }
};

在上面的例子中,addStudent()函数接受一个Student对象的引用作为参数。通过使用this指针,我们可以在Teacher对象中调用该函数,并将当前Teacher对象作为参数传递给addStudent()函数,从而将自己添加到Teacher对象的students容器中。

使用示例如下:

int main() {
    Teacher teacher;
    Student student1("Alice");
    teacher.addStudent(student1);
    Student student2("Bob");
    teacher.addStudent(student2);
    return 0;
}

在上述示例中,我们创建了一个Teacher对象teacher,并创建了两个Student对象student1和student2。然后,我们通过调用teacher的addStudent()函数,将student1和student2添加到teacher对象的students容器中。

这个例子展示了如何使用this指针在对象之间传递信息,实现对象之间的交互。通过this指针,我们可以方便地操作其他对象的成员函数和成员变量。

this指针和静态成员函数

静态成员函数中不能使用 this 指针!

因为静态成员函数并不具体作用与某个对象!

因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数!

在C++中,this指针和静态成员函数之间有一些区别。

  1. 静态成员函数没有this指针:由于静态成员函数不属于任何特定的对象,它们没有this指针。因此,在静态成员函数中不能使用this指针来访问对象的成员变量或其他非静态成员函数。
  2. 静态成员函数可以直接访问静态成员:静态成员函数只能访问静态成员变量和其他静态成员函数。静态成员是与类关联而不是与对象关联的,所以无需实例化对象即可访问。这是因为静态成员在编译时已经被分配了内存空间。
  3. 非静态成员函数可以访问this指针:非静态成员函数可以使用this指针来访问调用该函数的对象的成员变量和其他非静态成员函数。this指针是一个隐式传递给非静态成员函数的指针,它指向当前对象的地址。

需要注意的是,静态成员函数可以通过类名直接调用,而非静态成员函数必须通过对象来调用。另外,静态成员函数在全局作用域中也是可见的,可以通过类名来访问,而非静态成员函数则需要通过对象或对象指针来访问。

举个例子,假设有一个名为"Math"的类,其中包含一个静态成员变量PI和一个静态成员函数add(),以及一个非静态成员变量num和一个非静态成员函数multiply()。代码如下所示:

class Math {
public:
    static const double PI;
    static int add(int a, int b) {
        return a + b;
    }
    int num;
    int multiply(int a, int b) {
        return a * b;
    }
};
const double Math::PI = 3.14159;

在上述示例中,静态成员变量PI可以直接通过类名访问,如Math::PI。静态成员函数add()也可以通过类名直接调用,如int sum = Math::add(2, 3)

而非静态成员变量num和非静态成员函数multiply()需要通过对象来访问,如:

Math math;
math.num = 10;
int product = math.multiply(4, 5);

总结一下,this指针只能在非静态成员函数中使用,用于访问当前对象的成员变量和其他非静态成员函数。静态成员函数没有this指针,只能访问静态成员变量和其他静态成员函数。静态成员通过类名直接访问,而非静态成员需要通过对象来访问。

在C++中,静态成员是属于类本身而不是类的实例的成员。静态成员在所有类的对象之间是共享的,它们被存储在静态数据区中,并且在程序运行期间只有一份副本。

静态成员可以是静态成员变量或静态成员函数。

  1. 静态成员变量:静态成员变量是与类关联而不是与类的对象关联的。它们由类的所有对象共享,无论创建多少个对象,静态成员变量都只有一个副本。静态成员变量通常用于表示与类相关的全局属性或计数器等。定义静态成员变量时,需要在声明前加上static关键字,并在类外部初始化。
class MyClass {
public:
    static int count;
};
int MyClass::count = 0; // 静态成员变量的初始化
int main() {
    MyClass::count++; // 访问静态成员变量使用类名和作用域解析运算符
    return 0;
}
  1. 静态成员函数:静态成员函数是与类关联而不是与类的对象关联的函数。它们不操作特定对象的成员变量,也没有this指针。静态成员函数可以直接通过类名调用,无需实例化对象。静态成员函数通常用于执行与类相关的一般操作,而不依赖于特定对象。
class MyClass {
public:
    static void printMessage() {
        std::cout << "This is a static member function." << std::endl;
    }
};
int main() {
    MyClass::printMessage(); // 调用静态成员函数使用类名和作用域解析运算符
    return 0;
}

需要注意的是,静态成员变量和静态成员函数都属于类本身,而不是类的对象。因此,在静态成员函数中不能直接访问非静态成员变量或非静态成员函数,只能访问其他静态成员。

总结一下,静态成员是属于类本身的成员,与类的对象无关。静态成员变量由类的所有对象共享,并且在程序运行期间只有一个副本。静态成员函数不依赖于特定对象,可以通过类名直接调用。静态成员通常用于表示与类相关的全局属性或执行与类相关的一般操作。

静态成员

普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。

普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。

因此静态成员不需要通过对象就能访问。

在C++中,静态成员是属于类本身而不是类的实例的成员。静态成员在所有类的对象之间是共享的,它们被存储在静态数据区中,并且在程序运行期间只有一份副本。

静态成员可以是静态成员变量或静态成员函数。

  1. 静态成员变量:静态成员变量是与类关联而不是与类的对象关联的。它们由类的所有对象共享,无论创建多少个对象,静态成员变量都只有一个副本。静态成员变量通常用于表示与类相关的全局属性或计数器等。定义静态成员变量时,需要在声明前加上static关键字,并在类外部初始化。
class MyClass {
public:
    static int count;
};
int MyClass::count = 0; // 静态成员变量的初始化
int main() {
    MyClass::count++; // 访问静态成员变量使用类名和作用域解析运算符
    return 0;
}
  1. 静态成员函数:静态成员函数是与类关联而不是与类的对象关联的函数。它们不操作特定对象的成员变量,也没有this指针。静态成员函数可以直接通过类名调用,无需实例化对象。静态成员函数通常用于执行与类相关的一般操作,而不依赖于特定对象。
class MyClass {
public:
    static void printMessage() {
        std::cout << "This is a static member function." << std::endl;
    }
};
int main() {
    MyClass::printMessage(); // 调用静态成员函数使用类名和作用域解析运算符
    return 0;
}

需要注意的是,静态成员变量和静态成员函数都属于类本身,而不是类的对象。因此,在静态成员函数中不能直接访问非静态成员变量或非静态成员函数,只能访问其他静态成员。

总结一下,静态成员是属于类本身的成员,与类的对象无关。静态成员变量由类的所有对象共享,并且在程序运行期间只有一个副本。静态成员函数不依赖于特定对象,可以通过类名直接调用。静态成员通常用于表示与类相关的全局属性或执行与类相关的一般操作。

当使用静态成员时,有一些特性和注意事项需要了解:

  1. 静态成员变量的初始化:静态成员变量在类外部进行初始化,通常在源文件中进行。可以通过在类定义之外使用类名和作用域解析运算符来访问和初始化静态成员变量。
  2. 静态成员函数的调用:静态成员函数可以直接通过类名和作用域解析运算符来调用,无需实例化对象。它们不操作特定对象的成员变量,也没有this指针。因此,在静态成员函数内部不能直接访问非静态成员变量或非静态成员函数。
  3. 访问权限:静态成员可以具有公共、私有或受保护的访问权限修饰符,就像其他类成员一样。可以使用public、private或protected关键字来控制对静态成员的访问权限。
  4. 静态成员的作用域和生存周期:静态成员在类的整个生命周期都存在,并且在所有类的对象之间是共享的。静态成员的作用域限于其定义所在的类,可以通过类名和作用域解析运算符来访问。
  5. 静态成员的存储位置:静态成员变量在程序运行期间只有一个副本,它们被存储在静态数据区中。因此,无论创建多少个类的对象,静态成员变量始终保持相同的值。
  6. 静态成员和非静态成员之间的区别:静态成员属于类本身,而非静态成员属于类的对象。静态成员在所有对象之间共享,而非静态成员每个对象都有自己的副本。此外,静态成员函数没有this指针,无法访问非静态成员。

需要注意的是,静态成员的设计应该遵循一定的规则和原则。静态成员通常用于表示与类相关的全局属性或执行与类相关的一般操作,而不依赖于特定对象的状态。在使用静态成员时,应该明确其适用范围和目的,以保证代码的可读性和可维护性。

总结一下,静态成员是属于类本身的成员,与类的对象无关。静态成员变量在程序运行期间只有一个副本,静态成员函数可以直接通过类名调用。静态成员通常用于表示与类相关的全局属性或执行与类相关的一般操作。在使用静态成员时,应注意初始化、访问权限、作用域、生存周期等特性。

目录
相关文章
|
1月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
89 10
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
1月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
152 12
|
2月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
77 0
|
4月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
139 17
|
3月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
87 0
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
89 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
167 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
175 12
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
127 16

热门文章

最新文章