首页 > 编程语言 >C++特殊成员

C++特殊成员

时间:2023-02-15 11:34:27浏览次数:40  
标签:特殊 const cout int 成员 C++ static 函数


参考书籍:

C++ Primer
Essential C++

编译器:

gcc / g++

C++特殊成员

const成员

  • const修饰的数据成员
  • 初始化必须采用初始化参数列表
  • 不能被修改
  • 构造函数必须要初始化常数据成员
  • const修饰的成员函数
  • 写法上要注意: const修饰是写在函数后面
  • const成员函数不能修改任何的数据成员
  • 如果实在是要在常成员函数中修改该数据,用mutable修饰数据成员即可
  • 常成员函数可以普通函数同时存在
  • const对象
  • const修饰的对象
  • 常对象只能调用常成员函数
#include <iostream>
using namespace std;
class MM {
public:
MM(int age) : name("小芳"), num(4323) {
this->age = age;
}
MM(string name, int age, int num) : name(name), age(age), num(num) {}
// MM() {} 常数据必须要初始化,错误
// MM() = default; //正确,可以构造无参对象
void print() {
age = 18;
// num = 11; //不能修改常数据成员
cout << this->name << " " << this->num << " " << this->age << endl;
cout << "普通函数" << endl;
}
//常成员函数: const写在函数后面
void print() const {
cout << this->name << " " << this->num << " " << this->age << endl;
cout << "常成员函数" << endl;
}
void printData() const {
// age = 23; //常成员函数,不能修改数据成员
cout << this->name << this->num << this->age << endl;
}
void test() {}

protected:
//常数据成员
const string name;
const int num;
int age; // mutable 可修改的意思
};

int main(int argc, char** argv) {
MM mm("小丽", 18, 1001);
//如果普通函数和常成员函数同名
mm.print(); //普通对象优先调用普通函数
const MM object(18);
object.print(); //常对象只能调用常成员函数
object.printData();
// object.test();
// //错误,常对象只能调用常成员函数
return 0;
}

static成员

static成员不属于某一个单独对象,是属于类的,通俗一点讲,是所有对象的共享的,static成员依然受权限

satic成员他的访问可以不需要对象(用类名限定的方式去访问)

  • static数据成员
  • 初始化必须在类外初始化
  • 类实现的时候不需要用static修饰了
  • static成员函数
  • static写在修饰函数的前面
  • 类外实现也不需要static修饰
  • 静态函数中没有this指针
  • 静态成员函数的访问问题
  • 静态成员函数访问静态成员 是可以直接访问
  • 静态成员函数访问非静态数据成员,必须通过指定对象的方式
  • 静态成员函数传参
  • 在静态成员函数定义对象去访问
#include <iostream>
#include <string>
using namespace std;
class User {
public:
User(string name = "默认") {
this->count++; //类中访问
this->m_count++;
}
void print() {
cout << name << " " << count << endl;
}
// void test() {} 不能和普通函数形参重载效果,会造成重定义问题
public:
static void test();
static void testData(User& object);

private:
string name;

public:
static int count;
int m_count = 0;
};
//必须在类外面做初始化,不需要static修饰了
int User::count = 0;
void User::test() {
cout << "count:" << count << endl;
// cout << "m_count:" << m_count << endl;
// //静态成员函数中不能直接调用非静态成员
cout << "静态函数" << endl;
}
void User::testData(User& object) {
cout << object.m_count << endl; //传参
User mm;
cout << mm.m_count << endl; //创建对象
}

int main(int argc, char** argv) {
cout << User::count << endl; // static 成员访问不需要对象
User object[3];
cout << User::count << endl;
User mm;
cout << mm.count << endl;
cout << User::count << endl; //可以用类名访问,前提是权限没问题
cout << mm.m_count << endl; //不能用类名
User::test(); //因为存在这种调用,所以静态成员函数中不能存在this指针
mm.test();
return 0;
}

顺便介绍一下多文件的写法(Google)

  • 一个类一个模块
  • 声明写在.h
  • 实现写在.cpp
  • 声明和试下写在一起 .hpp
  • 头文件包含尽量在.cpp完成
  • 设计项目时候,头文件形成交叉包含,说明思想有问题,自己重新设计代码
  • 不要为了拆分而拆分
  • 静态数据成员多文件写法

标签:特殊,const,cout,int,成员,C++,static,函数
From: https://blog.51cto.com/u_15959862/6058979

相关文章

  • C++基础入门(超详细)
    话不多说,序言搞起来:自从开始学老师布置的任务后,目前还是OpenCV,哈~哈。我就莫名问老师:“以后编程是用C++还是python?”,果然还是太年轻,老师说:“两们都要精通”。唉!于是乎为期......
  • c++函数指针
    函数的地址是存储其机器语言代码的内存的开始地址。通常,这些地址对用户而言,既不重要,也没有什么用处,但对程序而言,却很有用。例如,可以编写将另一个函数的地址作为参数的函数。......
  • 解决在Windows上Android Studio写C/C++代码无法补全,没有代码提示的问题
    之前一直在Linux上开发应用,最近因为工作需要,系统切回了Windows,因为之前在Linux上的AndroidStudio中写C/C++代码很正常,该有的代码提示功能都有。但是在迁移到Windows上后......
  • C++ uppper_bound 使用
     map的key,默认按照从小到达排序;upper_bound(4),  #include<iostream>#include<vector>#include<map>#include<algorithm>usingnamespacestd;intmai......
  • 实现C++和C的混合编程
    实现C++和C的混合编程在C++出现之前,很多实用的功能都是用C语言开发的,很多底层的库也是用C语言编写的。这意味着,如果能在C++代码中兼容C语言代码,无疑能极大地提......
  • C/C++程序设计课程设计[2023-02-15]
    C/C++程序设计课程设计[2023-02-15]程序设计课程设计要求1、课程设计分组合作完成,每个小组最多3人。2、每组成员(不得超过3人)分工合作完成一个课程设计题目,每个人的任......
  • C++类的组合
    title:C++类的组合案例date:2022-05-1819:07:35tags:C++category:cpp参考书籍:C++PrimerEssentialC++编译器:gcc/g++C++类的组合什么是类的组合类的组合就是以......
  • 高效字符串匹配算法——BM 算法详解(C++)
    定义BM算法是由Boyer和Moore两人提出的一种高效的字符串匹配算法,被认为是一种亚线性算法(即平均的时间复杂度低于线性级别),其时间效率在一般情况下甚至比KMP还要快3......
  • c++通过http协议校时
    由于IP黑白名单的限制,我们能访问的ip和域名资源非常有限,现将通过http协议授时方法整理如下: #include<cstdio>#include<string.h>#include<curl/curl.h>#inclu......
  • 【opencv c++】实现yolov5部署onnx模型完成目标检测
    总代码#include<fstream>#include<sstream>#include<iostream>#include<opencv2/dnn.hpp>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>usin......