namespace

namespace

::

::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。

using namespace std

它声明了命名空间 std,后续如果有未指定命名空间的符号,那么默认使用 std,代码中的 string、cin、cout 都位于命名空间 std。

new delete

new 操作符会根据后面的数据类型来推断所需空间的大小。

int *p = new int;  //分配1个int型的内存空间
delete p;  //释放内存

如果希望分配一组连续的数据,可以使用 new[]:

int *p = new int[10];  //分配10个int型的内存空间
delete[] p;

函数重载

class

1.内存

    Student stackStu; //分配内存在栈
    Student *heapStu = new Student;//堆,程序员控制,和delete成对出现
    heapStu->age = 10;
    delete heapStu;

2.类的成员方法可以定义在内部,亦可以定义在外部,定义在内部的方法默认是内联函数.

3.C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。

4.一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成.调用没有参数的构造函数也可以省略括号

5.定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添加了一个冒号:,后面紧跟m_name(name), m_age(age), m_score(score)语句,这个语句的意思相当于函数体内部的m_name = name; m_age = age; m_score = score;语句,也是赋值的意思

使用参数初始化表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简明明了。

//使用参数初始化表来简化书写
Student(int age,float score);

Student::Student(int age ,float score):m_age(age),m_score(score){
    m_sex = NULL;
}

6.参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关C++构造函数的参数初始化表

7.初始化 const 成员变量的唯一方法就是使用参数初始化表.

this指针

static静态成员变量

    /*
     静态成员变量,对象之间共享数据.
     static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
     static 成员变量必须在类声明的外部初始化,具体形式为:
     type class::name = value;
     
     static 成员变量既可以通过对象来访问,也可以通过类来访问。
     */
    static int m_studentCount; //
    

const成员函数

const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。

常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字

C++ class和struct的区别

C++中的 struct 和 class 基本是通用的,唯有几个细节不同:

  • 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
  • class 继承默认是 private 继承,而 struct 继承默认是 public
  • class 可以使用模板
using namespace std;

class Student{
    
private:
    char *m_sex;//一般默认私有属性用m_开头
    int m_age;
    int m_score = 20;
    //const成员变量赋值只能通过参数初始化表
    const int m_constProperty = 200 ;
public:
    /*
     静态成员变量,对象之间共享数据.
     static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
     static 成员变量必须在类声明的外部初始化,具体形式为:
     type class::name = value;
     
     static 成员变量既可以通过对象来访问,也可以通过类来访问。
     */
    static int m_studentCount; //
    //静态成员函数
    /*
     普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
     */
    static int getTotalCount();
    //const成员函数
    /*
     const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。
     
     常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字
     */
    float logScore() const;
    
    //类包含的函数
    //内体中定义的函数默认是inline函数
    void say(){
        cout<<(m_sex == NULL)<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
    }
    void setsex(char *sex);
    //声明一个构造函数,定义之后必须调用
    Student(char *sex,int age ,float score);
    //重载构造函数,不对属性赋值
    Student();
    //使用参数初始化表来简化书写
    Student(int age,float score);
};
/*
 static 成员变量必须在类声明的外部初始化,具体形式为:
 type class::name = value;
 */
int  Student::m_studentCount = 0; //

int Student::getTotalCount(){
    return m_studentCount;
}
float Student::logScore() const{
//    m_score = 2; //编译错误
    return m_score;
}


void Student::setsex(char *sex){
    m_sex = sex;
}
//定义构造函数
Student::Student(char *sex,int age ,float score){
    m_sex = sex;
    m_age = age;
    m_score = score;
    m_studentCount+=1;
}
Student::Student(){
    m_sex = NULL;
    m_age = 0;
    m_score = 0;
    m_studentCount+=1;
}

Student::Student(int age ,float score):m_age(age),m_score(score){
    m_sex = NULL;
    Student::m_studentCount+=1;
}

void testclass(){
    Student stackStu(10,100); //分配内存在栈
    stackStu.say();
    Student *heapStu = new Student("nan",9,80);//堆,程序员控制,和delete成对出现
    heapStu->setsex("nv");
    heapStu->say();
    delete heapStu;
    
    Student *defaultStu = new Student;//使用无参数构造器,可以不加括号
    delete defaultStu;
}