Conclusion
To enforce existing rows in nullable columns to be updated with default values (thanks @Sean Lange for pointing it out),
- you are not able to achieve it by using
ALTER TABLE ADD CONSTRAINT against existing column (e.g., column created first and then adding constraint)
- you are able to do it by adding a new column and applying constraint at the same time (i.e.,
ALTER TABLE ADD column_name CONSTRAINT constraint_name)
Explanation
Below scripts are tested against Microsoft SQL Server 2016.
Adding constraint when creating new nullable column at the same time
CREATE TABLE #temp_db (col_a INT, col_b INT)
INSERT INTO #temp_db (col_a, col_b) VALUES (1, 2), (3, 4)
SELECT * FROM #temp_db
ALTER TABLE #temp_db
ADD col_c INT
CONSTRAINT col_c_def DEFAULT 0 WITH VALUES
SELECT * FROM #temp_db
INSERT INTO #temp_db (col_a, col_b) VALUES (5, 6), (7, 8)
SELECT * FROM #temp_db
DROP TABLE #temp_db

Note, make sure you apply WITH VALUES, otherwise existing rows will be set as NULL (reference).
ALTER TABLE #temp_db
ADD col_c INT
CONSTRAINT col_c_def DEFAULT 0 --WITH VALUES

Adding constraint after creating new nullable column
CREATE TABLE #temp_db (col_a INT, col_b INT)
INSERT INTO #temp_db (col_a, col_b) VALUES (1, 2), (3, 4)
SELECT * FROM #temp_db
ALTER TABLE #temp_db
ADD col_c INT
ALTER TABLE #temp_db
ADD CONSTRAINT col_c_def DEFAULT 0 FOR col_c WITH VALUES
SELECT * FROM #temp_db
INSERT INTO #temp_db (col_a, col_b) VALUES (5, 6), (7, 8)
SELECT * FROM #temp_db
DROP TABLE #temp_db

Note, applying WITH VALUES or not makes no difference to the result.
For non-nullable columns, you have to create it and specify default value
at the same time, as SQL server has no idea what values should be put into existing rows.
ALTER TABLE #temp_db
ADD col_c INT NOT NULL
CONSTRAINT col_c_def DEFAULT 0
ISNULL(<yourfield>,0)