C++(入门、核心、提高三篇)总结及补充

简介: C++(入门、核心、提高三篇)总结及补充

1. 定义常数


方法一 :开头跟头文件一起,不需要分号


#define Day 7


方法二:函数内部定义


const int day = 7;


2. 数据类型及字节大小





字符型占用1字节


3. 字符串


定义字符串两种方法


方法一:C风格形式


char str1[] = "abc";


方法二:


string str2 = "abc";


4. ++a和a++


++a:前置递增 先让变量+1 然后进行表达式的运算


a++:后置递增 先进行表达式的运算 后让变量+1


5. 三目运算符


语法:表达式1? 结果1 : 结果2


6. 生成随机数和随机数种子


#include <ctime>
srand((unsigned int)time(NULL));
rand(100)+1;   //0~100


7. const修饰指针


  1. 指针常量:相当于*p是常数


#include<iostream>
using namespace std;
void test01() {
  //常量指针:指针的指向可以修改,但是指针指向的值不可以修改
  const int* p;
  int a = 10;
  int b = 20;
  cout << "a的地址:" << &a << endl;
  cout << "b的地址:" << &b << endl;
  cout << "\n";
  p = &a;
  cout << "p指向a的地址时:";
  cout << "p = " << p << endl;
  cout << "*p = " << *p << endl;
  cout << "\n";
  p = &b;    //修改指向
  cout << "p指向b的地址时:";
  cout << "p = " << p << endl;
  cout << "*p = " << *p << endl;
  cout << "\n";
  //*p = 30;   //修改值,报错
}
int main() {
  test01();
  system("pause");
  return 0;
}


a的地址:000000DB16D1F654
b的地址:000000DB16D1F674
p指向a的地址时:p = 000000DB16D1F654
*p = 10
p指向b的地址时:p = 000000DB16D1F674
*p = 20


  1. 指针常量:相当于p是常数


#include<iostream>
using namespace std;
void test01() {
  //常量指针:指针指向不可以修改,指针指的值可以修改
  int a = 10;
  int b = 20;
  int* const p = &a;   //常量指针   需要赋初值
  cout << "p = " << p << endl;
  cout << "*p = " << *p << endl;
  *p = 30;             //值可以修改
  cout << "p = " << p << endl;
  cout << "*p = " << *p << endl;
  //p = &b;            //报错,指向不可以修改
}
int main() {
  test01();
  system("pause");
  return 0;
}


p = 000000DF366FF864
*p = 10
p = 000000DF366FF864
*p = 30


8. 指针遍历数组


#include <iostream>
using namespace std;
int main()
{
  //指针和数组
  //利用指针访问数组中的元素
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int* p = arr; 
  for (int i = 0; i < sizeof(arr)/4; i++){   //数组每个元素占4个字节
    cout << *p << " ";
    p++;
  }
  cout << endl;
  system("pause");
  return 0;
}


9. 结构体和类的区别


参考链接


10. 栈区和堆区


栈区:由编译器自动分配释放,存放函数的参数值,局部变量等


堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区数据利用new关键字进行开辟内存


11. 引用


引用做函数返回值,函数可以作为左值


#include<iostream>
using namespace std;
//2、函数的调用可以作为左值
int& test02()
{
  static int a = 10;  //静态变量,存放在全局区,全局区上的数据在程序结束后释放
  return a;
}
int main()
{
  int aa = test02();   //赋值
  int& b = test02();  //又给 test2()取别名   所以现在a b test02()都是同一个东西    
  test02() = 1000;   
  cout << "test02():" << test02() << endl;
  cout << "aa:" << aa << endl;
  cout << "b=" << b << endl;
  system("pause");
  return 0;
}


test02():1000
aa:10
b=1000
请按任意键继续. . .


12. 构造函数和析构函数


构造函数:用于初始化数据,构造函数可以重载


析构函数:用于清理工作


13. 深拷贝与浅拷贝


浅拷贝:简单的赋值拷贝操作


深拷贝:在堆区重新申请空间,进行拷贝操作


#include <iostream>
using namespace std;
//深拷贝与浅拷贝
class Person {
public:
  Person() {
    cout << "Person的无参构造函数调用" << endl;
  }
  Person(int age, int height) {
    m_Age = age;
    m_Height = new int(height);   //堆区   手动开辟手动释放
    cout << "Person的有参构造函数调用" << endl;
  }
  //自己实现拷贝构造函数 解决浅拷贝带来的问题
  Person(const Person& p) {
    cout << "Person 拷贝构造函数调用" << endl;
    m_Age = p.m_Age;
    //m_Height = p.m_Height;   //编译器默认实现就是这行代码,等号复制,即浅拷贝
    //深拷贝操作
    m_Height = new int(*p.m_Height);
  }
  ~Person() {
    //析构代码,将堆区开辟数据做释放操作
    if (m_Height != NULL) {
      delete m_Height;
      m_Height = NULL;
    }
    cout << "Person的析构函数调用" << endl;
  }
  int m_Age;
  int* m_Height;
};
void test01() {
  Person p1(18, 160);
  cout << "p1的年龄:" << p1.m_Age << ";身高为:"  <<*p1.m_Height << endl;
  Person p2(p1);
  cout << "p2的年龄:" << p2.m_Age << ";身高为:" << *p2.m_Height << endl;
}
int main() {
  test01();
  system("pause");
  return 0;
}


Person的有参构造函数调用
p1的年龄:18;身高为:160
Person 拷贝构造函数调用
p2的年龄:18;身高为:160
Person的析构函数调用
Person的析构函数调用
请按任意键继续. . .


14. 链式编程


#include<iostream>
using namespace std;
class Person {
public:
  Person(int age) {
    this->age = age;
  }
  Person& PersonAddAge(Person& p) {   //拷贝构造,且取别名,可作为左值
    this->age += p.age;
    //this指向p2的指针,而*this指向的就是p2这个对象的本体
    return *this;
  }
  int age;
};
//2、返回对象本身用*this
void test02() {
  Person p1(10);
  Person p2(10);
  //链式编程思想
  p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
  cout << "p2的age:" << p2.age << endl;
}
int main() {
  test02();
  system("pause");
  return 0;
}


p2的age:40
请按任意键继续. . .


15. 常函数和常对象


常函数


  • 成员函数后加const后我们称为这个函数为常函数


  • 常函数内不可以修改成员属性


  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改


常对象


  • 声明对象前加const称该对象为常对象


  • 常对象只能调用常函数


#include<iostream>
using namespace std;
//常函数
class Person {
public:
  //this指针的本质 是指针常量  指针的指向是不可以修改的
  //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
  void showPerson() const 
  {
    //this->m_A = 100;
    this->m_B = 10;
    cout << "m_B:" << this->m_B << endl;
    //this = NULL; //this指针不可以修改指针的指向的
  }
  void func() {}
  int m_A;
  mutable int m_B;  //特殊变量,即使在常函数中,也可以修改这个值
};
void test01() {
  Person p;
  p.showPerson();
}
//常对象
void test02() {
  const Person p;   //在对象前加const,变为常对象
  //p.m_A = 100;
  p.m_B = 100;     //m_B是特殊值,在常对象下也可以修改
  cout << "now,m_B:" << p.m_B << endl;
  //常对象只能调用常函数
  p.showPerson();
  //p.func();  //常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性
}
int main() {
  test02();
  system("pause");
  return 0;
}


16. 纯虚函数


纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;


17. 容器


vector<int> v(20)   //可以定时直接写上容量大小
v[15] = 1;  //可以直接给对应位置等号复制
目录
相关文章
|
22天前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
5月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
74 2
C++入门12——详解多态1
|
5月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
52 3
|
5月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
108 1
|
5月前
|
存储 C++ 容器
C++入门9——list的使用
C++入门9——list的使用
33 1
|
5月前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
123 1
|
5月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
56 1
|
5月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
100 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
5月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
51 0