面试复习

Aki 发布于 2024-05-20 297 次阅读


#include <iostream>
using namespace std;

class A
{
public:

	A() : a(10) {}

	//加了const说明函数参数类型是const A* const this,只能调用const类型的函数
	void func1()const { func3(); }

	//这里没加const可以调用const和非const
	void func2() { func1(); func4();}

	//修改mutable变量
	void func3()const { b = 10;};

	void func4(){}

	//const 修饰只能使用初始化列表赋值
	const int a;

	//mutable修饰的成员变量可以在const成员函数中改变
	mutable int b;

	//static 修饰的变量属于静态变量不属于某一个对象属于整个类,必须在类外初始化
	static int c;

};

int A::c = 20; // 在类外初始化静态成员变量c

int main()
{
	//指针常量,指针指向不可以修改,但是指向的内容可以修改
	 int* const p = new int(20);
	 *p = 30;

	 //常量指针,指针指向可以修改,但是指向的内容不可以修改
	 const int* q = new int(30);
	 q = new int(50);

	return 0;
}
class A
{
public:

	//静态成员函数作用域属于类,可以通过类型直接访问
	//静态成员函数只能调用静态函数和使用静态变量
	static void func() { a = 30; func4();}

	//const函数可以使用const成员函数和静态函数和静态变量
	void func2()const { func5(); func(); a = 30; }

	//普通函数都可以使用
	void func3() { func(); func2(); b = 30; a = 50; }

	//原理是函数参数不同
	//static函数参数没有this指针

	static void func4(){}
	void func5()const {}

	static int a;
	int b = 20;
};

int A::a = 10;
#include <iostream>
using namespace std;

class B;
class A;
class C;

class C
{
public:
	void func(B& b);
};

class A
{
public:

	//声明func函数
	void func(B& b);

private:
	int a = 10;
};

class B
{
public:

	//声明A的func函数是B的友元函数,也就是func函数可以访问B的保护私有成员
	friend void A::func(B& b);

	//声明类C为B的友元类,类C中的所有函数可以访问B的保护私有成员
	friend class C;

	//声明一个全局函数,该函数可以访问B的保护私有成员
	friend void func2(B& b);

private:
	int b = 20;
};

//友元函数类外实现 !!!
void A::func(B& b)
{
	b.b;
}

//友元函数类外实现 !!!
void C::func(B& b)
{
	b.b;
}

//友元函数类外实现 !!!
void func2(B& b)
{
	b.b;
}

int main()
{
	A a;
	B b;
	C c;
	a.func(b);
	c.func(b);
	func2(b);

	return 0;
}
//数组会自动退化为指针!!!
void func(char c[100])
{
	//8
	cout << sizeof(c) << endl;
}
char c[10];
//10
cout << sizeof(c) << endl;
func(c);
	

#include <iostream>
using namespace std;



class Base
{
public:

	Base():p(new int(0)){ cout << "父类默认构造" << endl; }
	Base(int a) :p(new int(a)){ cout << "父类有参数构造" << endl; }
	Base(const Base& rhs):p(new int(*rhs.p)) { cout << "父类拷贝构造" << endl; }

	Base& operator=(const Base& rhs)
	{
		if (this != &rhs)
		{
			*p = *rhs.p;
		}
		cout << "父类赋值函数" << endl;
		return *this;
	}

	virtual ~Base()
	{
		if (p)
			delete p;
		p = 0;
		cout << "父类析构" << endl;
	}

	
	//虚函数
	virtual void func(){}

	//纯虚函数
	//有纯虚函数的类叫做抽象类,不能够实例化对象
	virtual void func2() = 0;

	int* p;
};

class Derived : public Base
{
public:

	//在 C++ 中,子类的构造函数必须要调用一个父类的构造函数,无论是显式还是隐式的。
// 如果在子类构造函数中没有显式地调用父类的构造函数,则会自动调用父类的默认构造函数(无参数的构造函数)。
// 如果父类没有默认构造函数,而子类的构造函数又没有显式地调用任何其他父类的构造函数,则会导致编译错误。
//这意味着,你总是需要确保父类有一个可以被调用的构造函数,无论是通过定义一个默认构造函数,
// 还是通过在子类的构造函数中显式调用一个存在的父类构造函数。


	Derived():Base(), q(new int(0)) { cout << "子类默认构造" << endl; }
	Derived(int r,int l) :Base(r),q(new int(l)){ cout << "子类有参数构造" << endl; }
	Derived(const Derived& rhs):Base(rhs),q(new int(*rhs.q)) { cout << "子类类拷贝构造" << endl; }

	Derived& operator=(const Derived& rhs)
	{
		if (this != &rhs)
		{
			Base::operator=(rhs);
			*q = *rhs.q;
		}
		cout << "子类赋值函数" << endl;
		return *this;
	}

	//重写虚函数
	void func() override{}

	//重写纯虚函数
	void func2(){}

	~Derived()
	{
		if (q)
			delete q;
		q = 0;
		cout << "子类析构" << endl;
	}

	int* q;
};

//重载指的是函数名相同但是参数不同的函数重载
//重写指的是父类定义虚函数,子类重写父类的虚函数实现动态多态
//原理是虚函数表,每一个类都有唯一的虚函数表,每一个实例化的对象都有一个指向虚函数表的指针




int main()
{

	Base* p = new Derived(10,20);
	
	delete p;
	
	return 0;
}
//公共基类
class N
{
public:
    N(int data1, int data2, int data3) :
        m_data1(data1),
        m_data2(data2),
        m_data3(data3)
    {
        std::cout << "call common constructor" << std::endl;
    }
    virtual ~N(){}

    void    display()
    {
        std::cout << m_data1 << std::endl;
    }

public:
    int     m_data1;
    int     m_data2;
    int     m_data3;
};

//虚继承方式
class A : virtual public N
{
public:
    A() :N(11, 12, 13), m_a(1)
    {
        std::cout << "call class A constructor" << std::endl;
    }
    ~A(){}

public:
    int m_a;
};

//虚继承方式
class B :  virtual public N
{
public:
    B() :N(21, 22, 23), m_b(2)
    {
        std::cout << "call class B constructor" << std::endl;
    }
    ~B(){}

public:
    int m_b;
};

  // 类A和类B是虚继承方式
class C : public A, public B
{
public:
    //负责对直接基类的初始化 以及虚基类的初始化
    C() : A(), B(), N(31,32,33), 
        m_c(3)
    {
        std::cout << "call class C constructor" << std::endl;
    }
    void show()
    {
        std::cout << "m_c=" << m_c << std::endl;
    }

public:
    int m_c;
};


//此时基类N不是虚基类
class D : public N
{
public:
    //负责对基类的初始化
    D() :N(41, 42, 43),
        m_d(4)
    {
        std::cout << "call class D constructor" << std::endl;
    }
    void show()
    {
        std::cout << "m_d=" << m_d << std::endl;
    }

public:
    int m_d;
};


int _tmain(int argc,  _TCHAR* argv[])
{
    C data;   
    //直接使用基类数据
    data.m_data1 = 10;
    
    return 0;
}



1. **SELECT**
   - 示例:`SELECT name, age FROM users WHERE age > 18 ORDER BY name;`
   - 功能:从`users`表中检索年龄大于18的所有用户的名字和年龄,并按名字排序。

2. **UPDATE**
   - 示例:`UPDATE users SET email = 'newemail@example.com' WHERE id = 1;`
   - 功能:更新`users`表中`id`为1的用户的电子邮件地址。

3. **DELETE**
   - 示例:`DELETE FROM users WHERE last_login < '2022-01-01';`
   - 功能:删除`users`表中最后登录时间早于2022年1月1日的所有用户。

4. **INSERT INTO**
   - 示例:`INSERT INTO users (name, email, age) VALUES ('John Doe', 'john.doe@example.com', 28);`
   - 功能:向`users`表中插入一个新用户,包括其姓名、电子邮件和年龄。

5. **CREATE DATABASE**
   - 示例:`CREATE DATABASE mydatabase;`
   - 功能:创建一个名为`mydatabase`的新数据库。

6. **ALTER DATABASE**
   - 示例:`ALTER DATABASE mydatabase SET read_only = true;`
   - 功能:修改`mydatabase`数据库,设置为只读模式。

7. **CREATE TABLE**
   - 示例:`CREATE TABLE employees (id INT PRIMARY KEY, name VARCHAR(100), salary DECIMAL(10, 2));`
   - 功能:创建一个新表`employees`,包含`id`(主键)、`name`和`salary`列。

8. **ALTER TABLE**
   - 示例:`ALTER TABLE employees ADD COLUMN department VARCHAR(50);`
   - 功能:在`employees`表中添加一个新列`department`。

9. **DROP TABLE**
   - 示例:`DROP TABLE old_data;`
   - 功能:删除名为`old_data`的表及其所有数据。

10. **CREATE INDEX**
    - 示例:`CREATE INDEX idx_name ON users (name);`
    - 功能:在`users`表的`name`列上创建一个索引,以加快基于名字的查询速度。

11. **DROP INDEX**
    - 示例:`DROP INDEX idx_name ON users;`
    - 功能:删除`users`表上名为`idx_name`的索引。